資源(CPU 時間和記憶體)限制和在 Linux 中違反程序時終止
問題:
給定一個程序,限制它及其子程序可以使用的資源。即設置CPU時間和虛擬記憶體配額。當程序組超過限制之一時,終止它,否則列印它已使用的 CPU 時間和虛擬記憶體量。
具體案例:
基本上我必須執行幾個二進製文件,它們需要文件輸入,但我必須確保它們的執行過程受到嚴格限制。例如,二進製文件分配的記憶體不得超過 256 MB,並且執行時間應少於 0.5 秒。但是,我需要有關它使用的記憶體量和 CPU 的資訊。
我試過的:
- 幾天來,我一直在處理這個 perl 腳本,這是迄今為止我找到的最好的解決方案。不幸的是,它的記憶是錯誤的,而且不是很精確。這裡還有一個關於這個腳本的官方作者文章。
- 我已經嘗試使用這兩種工具
/usr/bin/timeout
和timeout
Linux 工具,這當然可以幫助我解決 CPU 時間配額,但不能幫助我解決由於違反虛擬記憶體限製而導致的程序終止。- 也嘗試過使用
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)