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

简介:

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

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

根据 linux 内核文档(链接见末尾)说明,各个分量含义如下:
 
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

http://code.google.com/p/sdkfz000/source/browse/trunk/tio/tio.py










本文转自 kevx 51CTO博客,原文链接:http://blog.51cto.com/spinlock/1140104,如需转载请自行联系原作者
目录
相关文章
|
存储 Linux API
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
在计算机系统的底层架构中,操作系统肩负着资源管理与任务调度的重任。当我们启动各类应用程序时,其背后复杂的运作机制便悄然展开。程序,作为静态的指令集合,如何在系统中实现动态执行?本文带你一探究竟!
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
|
11月前
|
并行计算 Linux
Linux内核中的线程和进程实现详解
了解进程和线程如何工作,可以帮助我们更好地编写程序,充分利用多核CPU,实现并行计算,提高系统的响应速度和计算效能。记住,适当平衡进程和线程的使用,既要拥有独立空间的'兄弟',也需要在'家庭'中分享和并行的成员。对于这个世界,现在,你应该有一个全新的认识。
365 67
|
11月前
|
Linux C语言
Linux读写锁源码分析
本文分析了读写锁的实现原理与应用场景,基于glibc 2.17源码。读写锁通过读引用计数、写线程ID、条件变量等实现,支持读优先(默认)和写优先模式。读优先时,写锁可能饥饿;写优先时,读线程需等待写锁释放。详细解析了`pthread_rwlock_t`数据结构及加解锁流程,并通过实验验证:2000个读线程与1个写线程测试下,读优先导致写锁饥饿,写优先则正常抢占锁。
329 19
|
9月前
|
Linux C语言 网络架构
Linux的基础IO内容补充-FILE
而当我们将运行结果重定向到log.txt文件时,数据的刷新策略就变为了全缓冲,此时我们使用printf和fwrite函数打印的数据都打印到了C语言自带的缓冲区当中,之后当我们使用fork函数创建子进程时,由于进程间具有独立性,而之后当父进程或是子进程对要刷新缓冲区内容时,本质就是对父子进程共享的数据进行了修改,此时就需要对数据进行写时拷贝,至此缓冲区当中的数据就变成了两份,一份父进程的,一份子进程的,所以重定向到log.txt文件当中printf和fwrite函数打印的数据就有两份。此时我们就可以知道,
196 0
|
9月前
|
存储 Linux Shell
Linux的基础IO
那么,这里我们温习一下操作系统的概念我们在Linux平台下运行C代码时,C库函数就是对Linux系统调用接口进行的封装,在Windows平台下运行C代码时,C库函数就是对Windows系统调用接口进行的封装,这样做使得语言有了跨平台性,也方便进行二次开发。这就是因为在根本上操作系统确实像银行一样,并不完全信任用户程序,因为直接开放底层资源(如内存、磁盘、硬件访问权限)给用户程序会带来巨大的风险。所以就向银行一样他的服务是由工作人员隔着一层玻璃,然后对顾客进行服务的。
127 0
|
存储 网络协议 Linux
【Linux】进程IO|系统调用|open|write|文件描述符fd|封装|理解一切皆文件
本文详细介绍了Linux中的进程IO与系统调用,包括 `open`、`write`、`read`和 `close`函数及其用法,解释了文件描述符(fd)的概念,并深入探讨了Linux中的“一切皆文件”思想。这种设计极大地简化了系统编程,使得处理不同类型的IO设备变得更加一致和简单。通过本文的学习,您应该能够更好地理解和应用Linux中的进程IO操作,提高系统编程的效率和能力。
553 34
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
通过本文,您可以了解如何在业务线程中注册和处理Linux信号。正确处理信号可以提高程序的健壮性和稳定性。希望这些内容能帮助您更好地理解和应用Linux信号处理机制。
246 26
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
本文详细介绍了如何在Linux中通过在业务线程中注册和处理信号。我们讨论了信号的基本概念,并通过完整的代码示例展示了在业务线程中注册和处理信号的方法。通过正确地使用信号处理机制,可以提高程序的健壮性和响应能力。希望本文能帮助您更好地理解和应用Linux信号处理,提高开发效率和代码质量。
275 17
|
Linux API C语言
Linux基础IO
Linux基础IO操作是系统管理和开发的基本技能。通过掌握文件描述符、重定向与管道、性能分析工具、文件系统操作以及网络IO命令等内容,可以更高效地进行系统操作和脚本编写。希望本文提供的知识和示例能帮助读者更深入地理解和运用Linux IO操作。
280 14

热门文章

最新文章