一个io性能分析案例

一个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]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值