【问题标题】:Count read bytes in linux? [closed]计算linux中的读取字节数? [关闭]
【发布时间】:2020-10-18 14:29:36
【问题描述】:

我从 main.cpp 中的文件读取

#include <iostream>
#include <fstream>
#include <unistd.h>
#include <string>
int main() {
    std::ifstream in ("file.txt");
    std::string str;
    in >> str;
    in.close();
    std::cout << str << std::endl;
    sleep(100);
}

/proc/[pid]/io 运行前的状态:

rchar: 11179
wchar: 18
syscr: 15
syscw: 2
read_bytes: 0
write_bytes: 0
cancelled_write_bytes: 0

但是进程io中的read_bytes值在读取后没有改变。为什么?

【问题讨论】:

  • “进程的 io 文件”我假设您的意思是 /proc/PID/io?
  • 是的,/proc/[pid]/io

标签: c++ linux unix


【解决方案1】:

来自man proc,下/proc/[pid]/io

read_bytes:读取的字节数。尝试计算此过程确实导致的字节数 从存储层获取。这对于块支持的文件系统是准确的。

正如我所解释的那样,如果您的文件已经缓存在内存中,那么读取它不会导致 read_bytes 数字增加。

您可以先尝试使用echo 3 | sudo tee /proc/sys/vm/drop_caches 删除缓存。然后我怀疑当你再次运行你的程序时,你会在read_bytes 中看到一个非零数字。请注意,由于从存储中读取是作为完整块(通常为 4K 字节)完成的,因此即使您的文件小于该数字,您也会看到该数字的块大小的倍数。

【讨论】:

  • 确实是非零值,等于5554176,但我以为是“ProcessID = 1”,为什么这么大?
  • 等一下,您是在查看 /proc/[pid]/io 的进程还是 PID 1?无论哪种方式,请注意,这将计算加载程序二进制文件和任何尚未在缓存中的共享库以及 C 库初始化例程读取的任何其他文件所需的磁盘读取。您可以使用strace 来查看正在执行的所有操作。
猜你喜欢
  • 1970-01-01
  • 2014-01-20
  • 1970-01-01
  • 2014-03-30
  • 1970-01-01
  • 1970-01-01
  • 2014-05-25
  • 2020-08-26
  • 1970-01-01
相关资源
最近更新 更多