Cluster

Sun Grid Engine (SGE) 中的 h_rss 和 h_vmem 有什麼區別?

  • December 11, 2018

據我了解,

  • mem_free可以指定在具有可用記憶體 = 的主機中送出作業mem_free,而
  • h_vmem是作業可以消耗的記憶體的硬限制,如果作業達到h_vmem,作業會崩潰?我認為我們可以將h_vmem主機的總物理記憶體設置為接近總物理記憶體,這樣作業就不會開始使用交換並減慢伺服器速度。

那是什麼h_rss?它似乎與的定義相同h_vmem.

還是我誤解了h_vmemh_vmem用於保留它可能需要的額外記憶體而不是所需的最小記憶體()mem_free?但是如果超過記憶體不要崩潰,所以作業可以超過h_vmem?

如果我的第二種解釋h_vmem是正確的,那麼我猜,對於要在主機中送出的作業,該作業必須同時滿足mem_freeh_vmem(給定h_vmem不是 INFINITY)。

如果我的第一個解釋h_vmem是正確的,那麼我想,對於要在主機中送出的作業,該作業可以mem_free單獨滿足而無需滿足h_vmem,因為它只保留可用空間,如果沒有可用空間,它沒關係?

資源是否可消耗,以及系統上可以保留多少資源是可配置的。您可以使用現有值之一,也可以創建一個新值,由您決定。

雖然無論如何設置它都沒有害處,但mem_free預設情況下它不是消耗品。這意味著雖然在您的作業開始時系統上必須有該數量的可用記憶體,但如果每個需要 10GB 可用記憶體的 10 個作業都可以在具有 11GB 可用記憶體的伺服器上同時啟動。如果它們都實際使用 10GB,那麼您將遇到麻煩。

其他人之間的差異歸結為執法。rss(物理記憶體使用)沒有被強制執行。vmem(虛擬記憶體使用)是。不幸的是,linux 沒有提供強制使用物理記憶體的好方法(cgroup 還可以,但 rss ulimit 在現代核心中實際上並沒有做任何事情)。

另一方面,認識到沒有正確的方法將 vmem 視為可消耗資源,這一點非常重要。如果您使用調試選項(在 clang 或 gcc5+ 中可用)在 C 中編譯“hello world” -fsanitize=address,它將使用 20TB 的虛擬記憶體,但少於 5MB 的物理記憶體。像 Java 和 Go 這樣的垃圾收集執行時也會分配大量的 vmem,而這些 vmem 永遠不會被反映為物理記憶體,以減少記憶體碎片。我的 8GB 筆記型電腦上的每個 chrome 標籤都使用 2TB 的虛擬記憶體作為其安全沙盒的一部分。這些對於程序來說都是完全合理的事情,並且設置一個下限會阻止表現完美的程序工作。同樣明顯的是,在系統上設置 20TB 的 vmem 消耗限制是沒有意義的。

如果您出於某種原因必須使用 h_vmem,則h_s_變體之間的區別在於哪個信號用於殺死超過限制的程序 -h_使用 SIGKILL 殺死程序(例如kill -9),而s_使用程序可以處理的信號(允許良好 -表現良好的工作乾淨地關閉,或者表現不佳的工作忽略信號)。最好的建議是首先哭泣,因為 vmem 限製本身就被破壞了,然後將 h_vmem 設置為略高於 s_vmem,這樣作業就有機會因有用的錯誤消息而死。

我的建議是讓集群管理員將 h_rss 配置為可消耗的,在您的作業模板中同時設置 h_rss 和 mem_free,完全避免使用 h_vmem,並希望人們不要通過預留記憶體不足來濫用系統。如果需要強制機制,這很複雜,但可以設置作業管理器以將作業放入記憶體 cgroup 並設置 memory.limit_in_bytes 或 memory.soft_limit_in_bytes。後者允許 cgroup 超出其保留,只要係統沒有耗盡記憶體。這提高了核心代表這些程序記憶體文件的能力,提高了每個人的性能,但存在一個風險,即當系統確實耗盡記憶體時,OOM 殺手沒有時間環顧四周從一個超限的 cgroup 中殺死一個程序,

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