Linux

記憶體管理的“好”

  • March 28, 2022

在問題之前,我給你一些背景知識:我在 VPS 上執行一個網站。VPS itselmf 執行 apache web 伺服器,PHP 程式碼生成帶有訪問 SQLite DB 的頁面,並執行由 cron 作業觸發的一些後台任務。

這些後台任務主要是更新 DB 值,並添加新記錄以顯示給網站使用者。

性能方面,網站的響應能力是優先考慮的,但後台任務對時間不敏感,如果必須延遲、減慢它們根本沒有問題……。考慮到我的訪問量並不多(每天大約 4000 次頁面查看,其中大部分都被記憶體了),我可以負擔得起以低優先級執行它們,它們仍然可以完成工作。CPU 方面,我以 0 的“niceness”(預設值)執行 apache,後台任務的“niceness”從 10 到 18。一切都很好。

記憶體是個問題,因為其中一些任務佔用了大量記憶體。其中一些實際上崩潰了,因為在需要時沒有足夠的記憶體。通常發生的是:

  1. 高記憶體消耗任務1被觸發
  2. 使用者訪問該網站 => 任務 1 延遲(我對此沒有問題)
  3. 任務 1 恢復
  4. 高記憶體消耗任務 2 被觸發。由於延遲,任務 1 未完成
  5. 使用者訪問網站 => 兩個任務都被延遲(仍然沒有問題)
  6. 任務 1 恢復並需要更多記憶體 => 沒有剩餘記憶體並且任務 1 崩潰
  7. 任務 2 完成
  8. 使用者訪問網站

VPS 在 1 Gig 的 RAM 系統上執行,目前沒有定義 SWAP。我認為添加一個 SWAP 空間(免費,因為它不會花費我更多),可能是解決我的問題的好方法。在上述事件的過程中,可以交換後台任務使用的一些記憶體,從而降低這些任務的性能,但話又說回來,我對此沒有任何問題。

我想避免的是交換 apache 記憶體,因為它會降低網站對最終使用者的響應能力。就像我用“nice”指出的那樣,apache 比背景任務更重要。如果您看到我的問題的另一種解決方案,歡迎您提出任何建議。我也在改進後台任務以減少它們的記憶體佔用,但這需要一些時間。

您可以使用 cgroups 來執行此操作。它允許您設置記憶體和記憶體+交換的限制,因此您可以強制程序進行交換。

或者,它還可以讓您獨立調整每個 cgroup 的 swappiness,這樣您就可以增加背景頁面被換出的機率:

https://en.wikipedia.org/wiki/Cgroups

引用自:https://serverfault.com/questions/344181