有个项目最近发现在执行一些oracle数据库的数据补入的sql语句时非常慢,经查发现来自存储的硬盘io会冲到100busy
device r/s w/s kr/s kw/s wait actv svc_t %w %b sd2 18.2 1204.5 5480.8 9524.5 0.0 14.0 11.4 1 100
|
分析:
每秒有1K多次写,
即平均来讲,每次写的时间只有1ms,或者说
每1ms就要完成1次写操作分析硬盘
存储硬盘:1W转/分。平均寻道时间3.5ms,
假设10个硬盘做raid5(不太确定)磁头平均等待时间按磁头每次都等待半圈计算,磁碟每转半圈需要的时间=60秒/10000转/2=3ms
每个硬盘的平均寻址时间=3.5ms+3ms=6.5ms
假设需求平摊到RAID5的硬盘上,按有效率提高7倍算,
6.5ms/7<=1ms结论:应付每秒1千多次的随机写,存储已经满负荷了
估计得从oracle上去想办法,看能否优化查询语句或合并一些随机写请求
同一台机器,另外一组不同时刻的数据
extended device statistics tty cpu device r/s w/s kr/s kw/s wait actv svc_t %w %b sd2 0.4 79.8 3.2 638.3 0.0 0.0 0.3 0 2 sd2 0.4 74.8 1.7 598.3 0.0 0.0 0.3 0 2 sd2 0.2 71.4 1.6 571.1 0.0 0.0 0.3 0 2 sd2 0.0 68.1 0.0 543.5 0.0 0.0 0.3 0 2 sd2 36.5 62.5 30700.1 500.0 0.0 0.7 7.2 0 43 sd2 74.9 48.8 65637.8 390.7 0.0 1.6 12.6 0 90 sd2 45.2 87.6 42729.4 701.0 0.0 1.9 14.0 0 93 sd2 76.6 74.4 73397.6 595.0 0.0 1.5 10.1 0 90
|
这个就复杂了,读写才几十MB字节,每秒读写次数都不到100,负荷居然也满了...
尝试分析从第一行90busy的开始
每秒种读写有123.7次,消耗的总寻址时间为120+ms,即只有880ms不到的时间用于数据读写,完成了读写70MB左右。理论最高值读写合计可达到70MB/880ms×1000ms=80MB/S
第二行 132.8,消耗132+ms,剩余870ms,完成50MB,50/870×1000=57MB/S
第三行 151.0,消耗150+ms,剩余850ms,完成80MB,80/850×1000=94MB/S
晕了,存储的磁盘RAID-5,从实际情况反推出来,最高理论值才接近100MB/S的水准??
哦对了,
和阵列连接的光纤卡速率也有关系,如果光纤卡是1gb,
最高吞吐量200MBps,读写同时理论值最高可达100MBps,那差不多也就才到一半嘛怎么回事?如果是2gb的和4gb的,这么低的速率明显就不对了。
光纤的速率查看: