在监视 SunOS5.10 机器时,我注意到奇怪的行为:
- 磁盘繁忙率接近100%
- 磁盘等待时间为 0,0%
这台机器的主要目的是在 jvm 上运行应用程序服务器。当服务器负载过重并且客户端连接被随机拒绝时,就会发生这种情况。如果问题与 IO 相关,则 IO 等待时间可能应超过 0.0%。我在机器上看不到任何其他瓶颈:CPU、RAM 充足,网络接口利用率低于 5%。在磁盘饱和时,系统每秒写入大约 0.5 MB 的数据,但几乎不读取任何数据。
数据通过 转储sarmon
,iostat -x
用于实时监控。示例iostat
输出:
extended device statistics
device r/s w/s kr/s kw/s wait actv svc_t %w %b
sd0,a 0.0 0.4 0.0 6.2 0.0 0.0 11.5 0 0
sd0,b 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0
sd0,c 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0
sd0,f 0.0 0.2 0.0 1.6 0.0 0.0 13.9 0 0
sd0,g 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0
sd0,h 0.0 111.6 0.0 519.9 0.0 1.0 8.9 0 94
统计数据是在操作系统级别进行的,因此测量结果应该是正确的。是否可以在应用程序级别可靠地检测磁盘饱和度并相应地减少负载?
当这种情况发生时,可能出现哪些情况?
我还使用dd测试磁盘的写入速度,结果如下:
time sh -c "dd if=/dev/zero of=/tmp/output bs=512 count=2048k"
2097152+0 records in
2097152+0 records out
real 0m3.250s
user 0m0.627s
sys 0m2.622s
答案1
看起来有一个线程每秒大约 111 次写入略多于 4KB 的数据。这足以使您的磁盘保持 100% 繁忙(111 iops * 9 毫秒服务时间 = 每秒 1 秒服务 = 100%)。由于没有其他进程在该磁盘(实际上是该分区)上写入数据,因此等待队列为空,所有请求都会立即处理。
那么您的工作负载就没有什么特别或奇怪的了,磁盘是瓶颈。
为了获得更好的性能,您可以选择更快的磁盘或 SSD,或者使用分布式写入的磁盘阵列,或者调整应用程序以使用更大的块,或者增加缓存大小。
您的dd
测试毫无意义,您不是在测量磁盘性能,而是在本质上测量缓存性能,尤其是在 Solaris 上,其中/tmp
可能由虚拟内存支持,tmpfs
这是该文件系统的默认设置。
答案2
http://en.wikipedia.org/wiki/Asynchronous_I/O,程序正在发起 I/O 请求,但不等待它们。然而,一旦 I/O 响应到来,它仍然可以接受并处理它们。