9

我没有找到解决方案,所以我不确定,有没有。

我有一个 VPS,有 512MB RAM 和 SSD 磁盘。

我的问题是:我想运行一个基于 java 的服务器程序,并且我希望它完全接受交换。它的 -Xms 现在是 384,但这还不够。

有什么解决办法吗?

ps:swappiness 是 60。我不想在 RAM 中看到这个过程 :-)

4

2 回答 2

17

cgroups可能对你有用。您可以应用内存限制,一旦进程达到该限制,它将开始交换。

这里有一个小例子和解释。

于 2013-06-15T11:20:17.817 回答
9

没有进程可以“完全”在交换中执行。代码+数据必须加载到 RAM 中,以便 CPU 读取/写入/执行它。你可以把东西暂时推出去交换,但是如果你的驻留集太小,你的系统会不断地交换。(即使使用 SSD,从磁盘加载也比从 RAM 加载慢数千倍。)

这种不断的交换将:

1) 降低整个系统的速度,因为磁盘的一些 I/O 带宽不断被使用

2) 缩短 SSD 的使用寿命,因为 SSD 在变坏之前具有有限数量的写入周期。

你最好的选择就是创建一个大的交换区域,然后像往常一样运行你的程序。操作系统会将不经常使用的位移出磁盘。如果您无法在系统的其余部分上获得良好的性能,那么您需要更多的 RAM。您可以尝试使用 ulimit 和/或 cgroups 来限制进程使用的 RAM 量,但这不能“解决”您的问题。

或者,您可以用更有效的语言重新编写服务器。(这是一种常见的权衡:程序员可能会花费数月时间优化运行时 CPU/内存占用,或者企业可能会在硬件上花费更多的钱。)

于 2013-06-15T17:35:16.910 回答