在提问之前,我先介绍一下背景:我在 VPS 上运行一个网站。VPS 本身运行 apache web 服务器,生成页面的 PHP 代码,并访问 SQLite DB,并运行一些由 cron 作业触发的后台任务。
这些后台任务主要更新DB值,并添加新记录以显示给网站用户。
性能方面,网站的响应能力是首要考虑因素,但后台任务对时间并不敏感,如果必须取消、减慢速度等,则完全没有问题。考虑到我的访问量并不多(每天大约 4000 次页面浏览,其中大部分都被缓存了),我可以在低优先级下运行这些任务,它们仍然可以完成工作。CPU 方面,我以 0(默认值)的“niceness”运行 apache,后台任务的“niceness”从 10 到 18。一切都很好。
内存是一个问题,因为其中一些任务占用大量内存。其中一些任务实际上会崩溃,因为当它们需要内存时没有足够的内存。通常发生的情况是:
- 高内存消耗任务1被触发
- 用户访问网站 => 任务 1 被延迟(我对此没有意见)
- 任务 1 恢复
- 触发高内存消耗任务 2。由于延迟,任务 1 未完成
- 用户访问网站 => 两个任务都延迟(仍然没有问题)
- 任务 1 恢复并需要更多内存 => 没有剩余内存,任务 1 崩溃
- 任务 2 完成
- 用户访问网站
- ...
VPS 在 1 GB 的 RAM 系统上运行,目前没有定义 SWAP。我认为添加 SWAP 空间(免费,因为它不会花费我更多)可能是解决我的问题的好方法。在上述事件过程中,后台任务使用的部分内存可能会被交换,从而降低这些任务的性能,但话又说回来,我对此没有意见。
我想避免的是交换 apache 内存,因为这会降低网站对最终用户的响应能力。正如我用“nice”表示的那样,apache 比后台任务更重要。如果您看到我的问题的另一种解决方案,欢迎您提出任何建议。我也在改进后台任务以减少它们的内存占用,但这需要一点时间。
答案1
您可以使用 cgroups 来执行此操作。它允许您设置内存和内存+交换的限制,以便您可以强制进程进入交换。
另外,它还允许您独立调整每个 cgroup 的 swappiness,这样您就可以增加背景页面被交换出去的几率: