我有一个 VPS,配备 9GB RAM、300GB HDD、3 GB 交换空间、7 核。操作系统是 CentOS 5.7 Final。
我的机器上运行着 postgres9.0,并进行了适当的调整(至少通过 PostgreSQL 的书籍/wiki)。
大多数情况下,当运行某些复杂查询时(复杂是指选择最多 3 个连接),尽管我的 RAM 有 ~75% 未使用,但仍有 ~99% 的交换正在发生。
编辑 :我在这里提到的可用 RAM 是通过 (可用 + 缓冲 + 缓存) 计算的。'free -m' 显示的实际可用 RAM 几乎不到 2%。所以如果我错了,请纠正我。
此外,它搞砸了我的磁盘 IO,大多数时候达到约 100%,并减慢了其他一切。(我倾向于相信我的磁盘出了问题。)
我不明白为什么会发生这么多的交换。是因为上下文切换吗?大多数时候我的处理器处于空闲状态,而在选择期间,IO 等待时间高达 30%。
如果有人能对此作出解释我将不胜感激。
谢谢。
答案1
当内存页使用频率不高时,即使还有剩余内存,Linux 内核也会决定将其放入交换区。您可以通过以下方式调整内存管理器的“swappiness”来调整此行为:
$ echo 50 > /proc/sys/vm/swappiness
其中是(尽可能少交换)和(尽可能多交换)50
之间的一个值。0
100
也可以看看维基百科:swappiness阅读有关此内容的更多信息。
答案2
看起来您可能正在查看正确的值,但只是为了以防万一您没有查看到,并且也为了防止其他人查看到错误的数字。
$ free -mt
total used free shared buffers cached
Mem: 2027 1953 73 0 66 1501
-/+ buffers/cache: 385 1641 <---- this value is actually free
Swap: 4086 0 4086
Total: 6113 1954 4159
这是我们总部库存/ERP 系统,为 40 多名总部员工服务并协调 9 个分支机构库存/ERP 系统,80%(1641MB)的 RAM 使用量被认为是免费的,但它并没有被浪费,而是做了一些有用的事情,充当了缓冲区/缓存。