一个io性能分析案例
背景:
1.业务进程拉起时调用pread函数磁阵文件,读取方法如下:
for(…){ …… pread( int fildes, void* buf, size_t nbyte, off_t offset ); }
2.磁阵以lvm卷管理方式进行管理,挂载方式如下:
/dev/mapper/lv_store on /home/storageFile type ext3 (rw)
3.业务进程与lvm卷由HA软件管理
Switch to pc2:
现象:
1.suse11下,进行双机切换时,业务进程需要3分钟完成文件读取;而在主机上对业务进程下线再上线,则完成文件读取的时间在1分钟以内:
offline -> online:
2.suse10下(与suse11使用的不是同一套存储),进行双机切换,业务进程1分钟左右能完成文件读取,双机切换或对进程下、上线,没有文件读取慢的问题。
问题:
1.为什么suse11下双机切换与单独对业务进程下上线两种情况,业务进程读取文件的时间有差别(pread调用返回慢)?
2.为什么suse11与suse10下,业务进程完成文件读取得时间有差别?
问题一分析思路:
1.问题是否真的存在(pread调用返回慢)?
使用strace跟踪业务进程的部分结果:
23018 18:45:05.374262 pread(15, <unfinished ...> 23018 18:45:05.443049 <... pread resumed> "X%\1\0W%\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4348, 615178240) = 4348 <0.068748> 23018 18:45:05.443229 pread(15, <unfinished ...> 23018 18:45:05.507130 <... pread resumed> "W%\1\0V%\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4348, 615170048) = 4348 <0.063881> 23018 18:45:18.345158 pread(15, "\326B\0\0\325B\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4348, 140156928) = 4348 <0.000011> 23018 18:45:18.345279 pread(15, "\327B\0\0\326B\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4348, 140165120) = 4348 <0.000011>
2.业务进程读取数据量是多少(两种情况下读的数据量是否一致),磁阵的处理能力是多少?
业务进程被拉起时,使用iostat显示io统计信息:
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util sdb 6.00 1.00 174.67 5.00 69176.00 227.67 386.29 38.45 115.27 5.57 100.00
3.什么因素影响磁盘读取速率?
使用free查看cache值的变化
echo 3 > /proc/sys/vm/drop_cachess
4.业务起了哪些进程读取磁阵,每个进程下发的io请求情况,进程读取哪些文件
- 使用pidstat -d查看进程请求io信息
- 使用strace查看进程在读写哪个文件描述符
- 查看/proc/PID/fd目录下,该文件描述符对应的文件名
pidstat查看进程io信息:
linux: # pidstat -d 1 17:53:59 PID kB_rd/s kB_wr/s kB_ccwr/s Command 17:54:00 30895 0.00 516.00 516.00 container 17:54:00 30937 0.00 4.00 4.00 container
问题一解决:
drop_cache之后,free命令查到cache大小为1G左右,进程读取完文件之后,cache大小变成7G多,说明读取的文件总量为6G左右。用iostat看,磁阵对io的处理能力为30m/s – 40m/s,因而所需处理时间最少为2~3分钟。
单单退出再拉起进程,进程读取磁盘时,会先从cache取数据;切换业务时,需要重新挂载lv,这时读取数据,会从磁盘上取,相比从cache取,速度会慢很多。
问题二分析思路:
1.suse10所连磁阵与suse11所连磁阵对IO请求的处理能力是否一样?
使用dd命令读取磁阵上的文件,比较两磁阵对io请求的处理能力:
dd if=/dev/mapper/lv_store of=/dev/null bs=4K count=1000000
2.suse10下业务进程请求读取的数据量,与suse11下是否一致?
- iostat 每秒处理的数据量 * 时间
- free -m看cache的值
问题二解决:
suse10下文件读取数据量为3G左右,与suse11下请求的数据量不一样。
延伸:
1.pread的读写磁盘的方式(offset递增或递减)对磁盘io处理时间的影响
2.磁盘处理io请求的调度算法
cat /sys/block/sda/queue/scheduler
noop anticipatory deadline [cfq]