关闭

在Linux下快速获取某个线程的IO读写情况

发表于:2013-3-06 09:14

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:kevx    来源:51Testing软件测试网采编

  最近线上发生Java进程疯狂写磁盘的杯具,虽然没有造成大碍.由此可以想到如果在出现问题的时候能够快速定位到相应的线程,然后通过其它工具确定该线程堆栈信息,就可以很大程度上解决问题.

  每个进程,在/proc目录下都对应一个子目录(以该进程id命名),关于该目录每个伪文件的内容,这里不一一细说。而进程所有的线程,都在task子目录下,目录结构是:/proc/[pid]/task/[tid]。其中/proc/[pid]和/proc/[pid]/task/[tid]这两个目录下的文件名和格式基本上一致,主要是由于Linux不存在NT式的原生线程支持,线程也是以LWP(light weight processes)的方法运行。而这里只关心其中一个即io这个文件,该文件的内容实际上就是进程的实时io信息,例如:

  根据linux内核文档(链接见末尾)说明,各个分量含义如下:

  http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=Documentation/filesystems/proc.txt;hb=HEAD#l1305

  rchar:读计数器。所有传送给read系统调用的count的和值,显然,像输出到控制台(printf)这种操作,也会被计入该计数器。注意read并不一定每次都会读count指定的那么多数据。

  [read系统调用原型:ssize_t read(int fd, void *buf, size_t count);]

  wchar:类似于rchar,只不过是写操作

  syscr:read系统调用被调用的次数;

  syscw:write系统调用被调用的次数;

  read_bytes:实际发生块设备读的字节数;

  write_bytes:实际发生块设备写的字节数;

  对于我们而言,最后两个分量才是最有价值的,最能体现进程读写磁盘的情况。

  根据个人的研究,很多工具如dstat也是利用这个原理的。

  一旦获取了线程id,就可以很方便的再使用jstack来分析该线程的调用堆栈,看看它究竟在干啥了。

  最后,我也写了一个python脚本,可以输出某个进程前10个读写最大的线程id。

《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号