iotop显示99.99%的kswapd0和0%的磁盘读取和磁盘写入

我有一个沉重的postgres查询。 这需要十多分钟的时间。 我想升级我的硬件,让它运行得更快。 我认为更多的内存将有所帮助,但是我的主板已经满了,所以我需要一个全新的主板。 除非我知道我会得到更好的结果,否则我不想投资。 以下是我在iotop中看到的内容:

总磁盘读取:46.81 M / s | 总的磁盘写入:0.00 B / s
   TID PRIO用户磁盘读取磁盘写入SWAPIN IO> COMMAND                                                                                                                                               
    27根/ 4根0.00 B / s 0.00 B / s 0.00%99.99%[kswapd0]
  2514 be / 4 postgres 46.81 M / s 2.45 M / s 0.00%18.36%postgres:postgres db1 127.0.0.1(55328)SELECT
     1根/ 4根0.00 B / s 0.00 B / s 0.00%0.00%初始
     2 be / 4根0.00 B / s 0.00 B / s 0.00%0.00%[kthreadd]
     3 be / 4 root 0.00 B / s 0.00 B / s 0.00%0.00%[ksoftirqd / 0]
     4 be / 4 root 0.00 B / s 0.00 B / s 0.00%0.00%[kworker / 0:0]
     5 be / 4 root 0.00 B / s 0.00 B / s 0.00%0.00%[kworker / u:0]
     6 rt / 4根0.00 B / s 0.00 B / s 0.00%0.00%[迁移/ 0]
     7 rt / 4根0.00 B / s 0.00 B / s 0.00%0.00%[看门狗/ 0]
     8 rt / 4根0.00 B / s 0.00 B / s 0.00%0.00%[迁移/ 1]
     9 be / 4 root 0.00 B / s 0.00 B / s 0.00%0.00%[kworker / 1:0]
    10根/ 4根0.00 B / s 0.00 B / s 0.00%0.00%[ksoftirqd / 1]

请注意kswapd0最多击中硬盘(99.99%IO)。 但是,kswap0的DISK READ和DISK WRITE和SWAPIN全部为零。 什么是kswap0在做什么? 这是否真的打到我的硬盘? 将增加更多的RAM到这个系统有帮助吗?

你从错误的angular度来看待这个问题。 只有在优化你的SQL之后,你才应该考虑在这个问题上抛出更多的RAM / CPU /磁盘(I / O带宽) – 并且在你确定的时候解决这个问题。

首先要求Postgres EXPLAIN (或者EXPLAIN ANALYZE )如何执行查询。
优化永远爱的小猫,然后如果你仍然有性能问题进一步调查,以确定哪里瓶颈( sonassi给你一些东西你应该看看除了iotop好build议 )。

如果你正在同一台服务器上运行你的web堆栈和数据库,现在是分离它们的好时机…

你是否110%确定你的IO-sub系统没有问题 – 例如,所有的硬盘都没有问题[智能/ RAID自检],写回caching被启用[如果你的电池备份caching在RAID卡上]?

是不是postgres以48MB / s的读取传输饱和了IO?

kswapd正在做一些处理linux上的虚拟内存所需的工作。 因此,在100%的情况下可能表明它正在做太多的工作,尽pipe它也可能是因为你的PG进程所占用的资源(例如,没有为缓冲IO留下RAM)而饿死。

我会检查通过常用工具使用/未使用多lessram。

关于除了kswapd0的IO列之外的统计信息的缺乏,我不能确定下面的解释是否正确,但是可能是内核不能在内核空间(这是kswapd所在的地方)跟踪swapin / swapout,因为Linux根本不会在内核空间中分配任何页面。

您没有提及任何其他重要的诊断信息。

 free -m cat /proc/meminfo top -b 

来自kswapd的I / O很可能是从postgres报告中伪造的。 其中一个进程可能处于D状态,但所有来自上述命令的数据都可以确认。 虽然很奇怪swapin是空的。