有沒有辦法告訴Linux不應該將特定進程的內存換出到磁盤上?我可以告訴Linux不要換出特定進程的內存嗎?
它是一個Java應用程序,所以理想情況下我希望有一種方法可以從命令行執行此操作。
我知道你可以將全局swappiness設置爲0,但這是明智的嗎?
有沒有辦法告訴Linux不應該將特定進程的內存換出到磁盤上?我可以告訴Linux不要換出特定進程的內存嗎?
它是一個Java應用程序,所以理想情況下我希望有一種方法可以從命令行執行此操作。
我知道你可以將全局swappiness設置爲0,但這是明智的嗎?
您可以通過Linux下的mlockall(2)系統調用來完成此操作;這將適用於整個過程,但請閱讀您需要傳遞的論點。
你是否真的需要將所有東西都拉進內核?如果它是一個Java應用程序,那麼您可能會鎖定整個JVM內核。我不知道這樣做的命令行方法,但是你可以寫一個簡單的程序來調用fork
,調用mlockall
,然後exec
。
您也可以查看madvise(2)中的某個訪問模式通知是否符合您的需求。向虛擬機子系統提供更好的分頁策略可能會更好,如果它適用於您。
請注意,很久以前,現在在SunOS下,有一種類似於madvise的機制,名爲vadvise(2)。
你可以通過mlock系列調用系列來實現。但是,我不確定是否可以爲不同的流程做到這一點。
作爲超級用戶,您可以「高興」到最高優先級-20,並希望這足以防止它被換出。它通常是。正數降低調度優先級。普通用戶無法向上(負號)
除極端特殊情況外,詢問此問題意味着您做錯了(tm)。
說真的,如果Linux想要交換,並且你試圖在內存中保留你的進程,那麼你對操作系統提出了不合理的要求。如果您的應用程序非常重要,那麼1)購買更多的內存,2)從機器上刪除其他應用程序/守護進程,或者將機器專用於您的應用程序,和/或3)投資一個非常快的磁盤子系統。這些步驟對於重要的應用程序是合理的。如果你不能證明它們是正確的,那麼你可能無法證明連接內存和捱餓其他進程。
你爲什麼要這樣做?
如果你想提高這個應用程序的性能,那麼你可能是在錯誤的軌道上。操作系統將換出一個進程來增加磁盤緩存的內存 - 即使有空閒的內存,內核也知道最好(編寫調度器的samrt傢伙最瞭解它)。
如果你有一個需要響應的進程(它在不使用時換出,而你需要快速重啓),那麼把它設置爲高優先級,mlock或使用實時內核可能會有所幫助。
如果你想改變swappiness的過程將其添加到cgroup中和該cgroup中設置的值:
https://unix.stackexchange.com/questions/10214/per-process-swapiness-for-linux#10227
存在着一類的應用程序中,你永遠不希望他們交換。一個這樣的類是一個數據庫。數據庫將使用內存作爲其磁盤區域的緩存和緩衝區,並且這絕對沒有意義,因爲這些都是可以交換的。特定的內存可能包含一些一週內不需要的相關數據,直到客戶請求它的一天。如果沒有緩存/交換,數據庫會簡單地在磁盤上找到相關記錄,這很快;但隨着交換,您的服務可能突然需要很長時間才能做出迴應。
mysqld
包括使用OS /系統調用memlock
的代碼。在Linux上,由於至少2.6.9,此係統調用將適用於具有CAP_IPC_LOCK
功能[1]的非根進程。當使用memlock()
時,該過程必須仍在LimitMEMLOCK
限制的範圍內工作。 [2]。關於systemd
的(少數)好事之一是,您可以授予mysqld
進程這些功能,而不需要特殊的程序。如果還可以按照您的預期設定rlimits,請使用ulimit
。下面是一個override
文件mysqld
,做必要的步驟,包括你可能需要一個過程,如數據庫中的其他幾個:
[Service]
# Prevent mysql from swapping
CapabilityBoundingSet=CAP_IPC_LOCK
# Let mysqld lock all memory to core (don't swap)
LimitMEMLOCK=-1
# do not kills this process if low on memory
OOMScoreAdjust=-900
# Use higher io scheduling
IOSchedulingClass=realtime
Type=simple
ExecStart=
ExecStart=/usr/sbin/mysqld --memlock $MYSQLD_OPTS
注意標準社區的MySQL當前附帶Type=forking
,並增加了--daemonize
在ExecStart
行的服務選項中。這本質上不如上述方法穩定。
UPDATE我對此解決方案並不滿意。經過幾天的運行,我注意到這個過程仍然有大量的交換!檢查/proc/XXXX/smaps
,我注意到以下內容:
memlock
選項已損壞。在這種情況下,這並不重要,因爲MySQL不能使用memlock堆棧。
如果您在應用程序上執行了「chmod + S」,Unix會用來表示「粘性位」,但我認爲這不再適用。 – 2009-02-23 16:00:39
對不起,我的意思是「chmod + t」,但我只是看着,Linux忽略了粘性位。 – 2009-02-23 16:02:16
http://blogs.msdn.com/b/oldnewthing/archive/2005/06/07/426294.aspx – Hello71 2011-02-09 03:08:32