确定在Linux系统中读/写的"逻辑"字节数

Bee*_*ope 8 linux io performance

我想确定所有进程通过系统调用(例如和)逻辑读取/写入的字节数.这与从存储层实际获取的字节数(由iotop等工具显示)不同,因为它包含(例如)读取页面缓存的读取,并且在识别写入时也有所不同:逻辑写入IO立即发生当调用时,而实际的物理IO可一段时间后,因各种因素出现(通常的Linux缓存写入和做物理IO一段时间后).read()write()write

我知道如何在每个进程的基础上执行此操作(例如,请参阅此问题),但不知道如何获得系统范围的计数.

Mar*_*555 10

如果要将/proc文件系统用于总计数(而不是每秒计数),则非常容易.

这也适用于相当老的内核(在Debian Squeeze 2.6.32内核上测试).

# cat /proc/1979/io
rchar: 111195372883082
wchar: 10424431162257
syscr: 130902776102
syscw: 6236420365
read_bytes: 2839822376960
write_bytes: 803408183296
cancelled_write_bytes: 374812672
Run Code Online (Sandbox Code Playgroud)

对于系统范围,只需对所有进程中的数字求和,但这只能在短期内得到好处,因为当进程死亡时,它们的统计信息将从内存中删除.您需要启用进程记帐才能保存它们.

这些文件的含义记录在内核源文件中Documentation/filesystems/proc.txt:

rchar - I/O计数器:字符读取

此任务导致从存储中读取的字节数.这只是这个进程传递给read()和pread()的字节总和.它包括tty IO之类的东西,它不受是否需要实际物理磁盘IO的影响(可能已从pagecache中读取了读取)

wchar - I/O计数器:写的字符

此任务导致或将导致写入磁盘的字节数.类似的警告同样适用于rchar.

syscr - I/O计数器:读取系统调用

尝试计算读取I/O操作的数量,即read()和pread()等系统调用.

syscw - I/O计数器:写系统调用

尝试计算写入I/O操作的数量,即write()和pwrite()等系统调用.

read_bytes - I/O计数器:读取的字节数

尝试计算此进程确实导致从存储层获取的字节数.在submit_bio()级别完成,因此它对于块支持的文件系统是准确的.

write_bytes - I/O计数器:写入的字节数

尝试计算此进程导致发送到存储层的字节数.这是在页面弄脏的时候完成的.

cancelled_write_bytes

这里的大不准确是截断.如果进程将1MB写入文件然后删除该文件,则实际上不执行写操作.但它会被认为造成了1MB的写入.换句话说:通过截断pagecache,此进程不会发生的字节数.任务也可能导致"负面"IO.