Memory
在系統級別限制 C、Java 程序的 CPU 和記憶體使用
我正在為 C 和 Java 建構一個線上程式碼編輯器。使用者可能會編寫無限循環。有什麼辦法可以在系統級設置中限制這些程序的 CPU 和記憶體使用率?
我的後端是一個 nodejs 程序,它從 user 接收程式碼,編譯並執行它。當程序超過 cpu 和記憶體的某些限制時,我想終止該程序。
是的——兩種主要方法是
setrlimit(2)
和(在 Linux 上)控制組。的主要優點
setrlimit
是它簡單且可移植(由 POSIX 指定)。您,然後為和fork
設置限制,然後是程式碼。缺點是它是每個程序的,所以程式碼仍然可以分叉超過限制(它分叉的每個程序都將獲得相同的限制,但它不是共享的)。您也可以設置為失敗(當然,無法測試需要分叉的程式碼)。RLIMIT_AS``RLIMIT_CPU``exec``RLIMIT_NPROC``fork
控制組 (cgroups) 的主要優點是它們可以將程序及其所有子程序一起處理——它們得到一個組合限制。缺點是不可移植性(僅限 Linux),而且更複雜。如果它正在管理您系統上的控制組,您可能還必須與 systemd 交談。cgroups 的最佳介紹是Neil Brown 在 LWN 上的 Control Group 系列。
另一種方法是在 VM 中執行程式碼,然後(至少在 KVM 的情況下)對主機來說是一個非常普通的程序。更重量級,但提供了很多隔離。
此外,作為旁注,如果您正在執行任意不受信任的程式碼,那麼您需要擔心的事情比無限循環要多得多。例如,您絕對不希望有人上傳垃圾郵件機器人。我建議查看現有的實現,但 AFAIK 它們不是開源的。