Process

資源(CPU 時間和記憶體)限制和在 Linux 中違反程序時終止

  • April 17, 2019

問題:

給定一個程序,限制它及其子程序可以使用的資源。即設置CPU時間和虛擬記憶體配額。當程序組超過限制之一時,終止它,否則列印它已使用的 CPU 時間和虛擬記憶體量。

具體案例:

基本上我必須執行幾個二進製文件,它們需要文件輸入,但我必須確保它們的執行過程受到嚴格限制。例如,二進製文件分配的記憶體不得超過 256 MB,並且執行時間應少於 0.5 秒。但是,我需要有關它使用的記憶體量和 CPU 的資訊。

我試過的:

  1. 幾天來,我一直在處理這個 perl 腳本,這是迄今為止我找到的最好的解決方案。不幸的是,它的記憶是錯誤的,而且不是很精確。這裡還有一個關於這個腳本的官方作者文章。
  2. 我已經嘗試使用這兩種工具/usr/bin/timeouttimeoutLinux 工具,這當然可以幫助我解決 CPU 時間配額,但不能幫助我解決由於違反虛擬記憶體限製而導致的程序終止。
  3. 也嘗試過使用ulimit,但正如我之前所說,我不僅需要限制,還需要對資源消耗進行回饋。

問題:

什麼可以解決這個問題?.

setrlimit(2)系統呼叫與限制資源有關(CPU 時間 - 整數秒數,因此至少 1 秒RLIMIT_CPU,文件大小RLIMIT_FSIZE,地址空間RLIMIT_AS,等等)。您還可以設置磁碟配額wait4(2)系統呼叫會告訴您 - 並提供回饋 - 關於一些資源使用情況。proc(5)告訴你更多,還有getrusage(2)SIGSTOP (你可以編寫一些監視器,它會定期使用、 callgetrusage或 query停止整個程序組/proc/$PID/,然後發送SIGCONT-to continue- 或SIGTERM-to terminate- 到該程序團體)。

valgrind工具在Linux 上非常有用,可以幫助查找記憶體洩漏。strace(1)也應該有幫助。

如果您可以重新編譯有故障的軟體,您可以考慮-fsanitize=address-fsanitize=undefined其他-fsanitize=… 選擇最新版本的GCC編譯器。

也許你有一些批處理。尋找批處理監視器,或者簡單地用 C、Python、Ocaml、Perl 編寫你自己的東西……(它派生命令,並循環監視它……)。也許你想要一些程序記帳(見acct(5) & sa(8) …)

請注意,“使用的記憶體量”(程序通常在執行mmap時向核心分配和釋放記憶體munmap)和“CPU 時間”(參見time(7),考慮多執行緒程序……)是非常模糊的概念.

另請參閱PAM並配置下的內容/etc/security/;也許inotify(7)也可能有幫助(但可能沒有)。

另請閱讀高級 Linux 程式系統呼叫(2)

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