Bash

如果我啟動太多後台作業會怎樣?

  • April 30, 2019

我需要使用期望腳本在 700 個網路設備上做一些工作。我可以按順序完成,但到目前為止執行時間約為 24 小時。這主要是由於建立連接所需的時間以及這些設備(舊設備)的輸出延遲。我能夠建立兩個連接並讓它們並行執行就好了,但是我能推多遠呢?

我不認為我可以一次完成所有 700 次,當然這個次數是有限度的。我的虛擬機可以管理的 telnet 連接數。

如果我確實嘗試以這樣的某種循環啟動其中的 700 個:

for node in `ls ~/sagLogs/`; do  
   foo &  
done

  • CPU 12 個 CPU x Intel(R) Xeon(R) CPU E5649 @ 2.53GHz
  • 記憶體 47.94 GB

我的問題是:

  1. 所有 700 個實例可能同時執行嗎?
  2. 在我的伺服器達到其限制之前,我能走多遠?
  3. 當達到該限制時,它會等待開始下一次迭代foo還是會崩潰?

不幸的是,我在公司生產環境中執行,所以我不能完全嘗試看看會發生什麼。

所有 700 個實例可能同時執行嗎?

這取決於你的意思是並發。如果我們很挑剔,那麼不,除非您的系統上有 700 個可以使用的執行執行緒(所以可能不會),否則他們不能。但實際上,是的,如果您在系統上有足夠的 RAM 和/或交換空間,它們可能可以。UNIX 及其各種子代非常擅長管理大量並發,這也是它們在大規模 HPC 使用中如此受歡迎的部分原因。

在我的伺服器達到其限制之前,我能走多遠?

如果沒有更多資訊,這是不可能具體回答的。差不多,你需要有足夠的記憶體來滿足:

  • 一個作業的整個執行時記憶體需求,乘以 700。
  • bash 管理這麼多作業的記憶體要求(bash 對此並不可怕,但作業控制並不是完全有效的記憶體)。
  • 系統上的任何其他記憶體要求。

假設你遇到了(同樣,只有 50GB 的 RAM,你仍然需要處理其他問題:

  • bash 在作業控制上會浪費多少 CPU 時間?可能不多,但有數百個工作崗位,這可能很重要。
  • 這需要多少網路頻寬?僅打開所有這些連接可能會淹沒您的網路幾分鐘,具體取決於您的頻寬和延遲。
  • 還有很多我可能沒有想到的事情。

當達到這個限制時,它會等待從 foo 開始下一次迭代還是會崩潰?

這取決於達到什麼限制。如果是記憶體,系統會當機(更具體地說,被核心殺死以試圖釋放記憶體)或者係統本身可能崩潰(將系統配置為在記憶體不足時故意崩潰並不罕見)。如果是 CPU 時間,它將繼續執行而不會出現問題,就不可能在系統上做很多其他事情。但是,如果是網路,您可能會導致其他系統或服務崩潰。


真正需要的不是同時執行所有作業。相反,將它們分成批次,並同時執行一個批次中的所有作業,讓它們完成,然後開始下一個批次。GNU Parallel ( https://www.gnu.org/software/parallel/ ) 可用於此目的,但在生產環境中以這種規模並不理想(如果您使用它,請不要太激進,就像我說的那樣,您可能會淹沒網路並影響您否則不會接觸到的系統)。我真的建議您研究像 Ansible 這樣的適當網路編排工具(https://www.ansible.com/),因為這不僅可以解決您的並發問題(Ansible 會像我上面提到的那樣自動進行批處理),還可以為您提供許多其他有用的功能(例如任務的冪等執行、良好的狀態報告以及與大量其他工具)。

引用自:https://unix.stackexchange.com/questions/516203