- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我读了proc/<pid>/io
测量 SQL 查询的 IO 事件,其中 <pid>
是数据库服务器的 PID。我在每次查询之前和之后读取值以计算差异并获取请求导致读取和/或写入的字节数。
据我所知的领域READ_BYTES
计算实际磁盘 IO,而 RCHAR
包括更多,例如 linux 页面缓存可以满足的读取(请参阅 Understanding the counters in /proc/[pid]/io 了解详情)。这导致了假设,即 RCHAR
应该得出等于或大于 READ_BYTES
的值, 但我的结果与这个假设相矛盾。
我可以想象我为 Infobright ICE 获得的结果有一些小的 block 或页面开销(值是 MB):
Query RCHAR READ_BYTES
tpch_q01.sql| 34.44180| 34.89453|
tpch_q02.sql| 2.89191| 3.64453|
tpch_q03.sql| 32.58994| 33.19531|
tpch_q04.sql| 17.78325| 18.27344|
但我完全无法理解 MonetDB 的 IO 计数器(值是 MB):
Query RCHAR READ_BYTES
tpch_q01.sql| 0.07501| 220.58203|
tpch_q02.sql| 1.37840| 18.16016|
tpch_q03.sql| 0.08272| 162.38281|
tpch_q04.sql| 0.06604| 83.25391|
我对 RCHAR
的假设错了吗?包括 READ_BYTES
?有没有办法欺骗 MonetDB 可以使用的内核计数器?这是怎么回事?
我可能会补充一点,我在每次查询之前清除页面缓存并重新启动数据库服务器。我在 Ubuntu 11.10 上,运行内核 3.0.0-15-generic。
最佳答案
我只能想到两件事:
1:
1446 read_bytes
1447 ----------
1448
1449 I/O counter: bytes read
1450 Attempt to count the number of bytes which this process really did cause to
1451 be fetched from the storage layer.
我读到“导致从存储层获取”以包括预读,无论如何。
2:
1411 rchar
1412 -----
1413
1414 I/O counter: chars read
1415 The number of bytes which this task has caused to be read from storage. This
1416 is simply the sum of bytes which this process passed to read() and pread().
1417 It includes things like tty IO and it is unaffected by whether or not actual
1418 physical disk IO was required (the read might have been satisfied from
1419 pagecache)
请注意,这并没有说明“通过内存映射文件访问磁盘”。我认为这是更可能的原因,您的 MonetDB 可能映射出它的数据库文件,然后对它们执行所有操作。
由于其性质,我不太确定如何检查 mmap 上使用的带宽。
关于linux - RCHAR 是否包含 READ_BYTES (proc/<pid>/io)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10637290/
我读了proc//io测量 SQL 查询的 IO 事件,其中 是数据库服务器的 PID。我在每次查询之前和之后读取值以计算差异并获取请求导致读取和/或写入的字节数。 据我所知的领域READ_BYTES
我是一名优秀的程序员,十分优秀!