systemd, प्रति उपयोगकर्ता cpu और / या मेमोरी सीमा


5

इसी तरह का सवाल है: Cgroups, प्रति उपयोगकर्ता मेमोरी को सीमित करते हैं, लेकिन समाधान "आधुनिक" सिस्टम में काम नहीं करता है, जहां cgroups पदानुक्रम को systemd द्वारा प्रबंधित किया जाता है।

सीधा समाधान - templating user-UID.slice - काम नहीं करेगा, क्योंकि यह समर्थित नहीं है, https://github.com/systemd/systemd/issues/2556 देखें

क्या वांछित प्रभाव प्राप्त करने का कोई तरीका है - प्रति उपयोगकर्ता के आधार पर सीपीयू और / या स्मृति संसाधनों का प्रबंधन करना?

UPD : मैं अपने समाधान को इतिहास के लिए रखूंगा, लेकिन systemctl set-propertyलॉगिन समय पर कॉल किया जाना चाहिए, उपयोग करके pam_exec, https://github.com/hashbang/shell-etc/pull/183 देखें । इस दृष्टिकोण में, उपयोगकर्ता के लॉगिन और सीमाओं की सेटिंग के बीच कोई समय खिड़की नहीं है।

मेरा समाधानइंटरफ़ेस org.freedesktop.login1.Manageकी /org/freedesktop/login1वस्तु का उत्सर्जन करता है UserNew(u uid, o object_path)संकेत। मैंने एक साधारण डेमॉन लिखा है जो सिग्नल को सुनता है और हर बार इसे CPUAccounting=trueसिर्फ लॉग-इन-इन-यूजर के स्लाइस के लिए सेट किया जाता है।

जवाबों:


3

UPD : मैं अपने समाधान को इतिहास के लिए रखूंगा, लेकिन systemctl set-propertyलॉगिन समय पर कॉल किया जाना चाहिए, उपयोग करके pam_exec, https://github.com/hashbang/shell-etc/pull/183 देखें । इस दृष्टिकोण में, उपयोगकर्ता के लॉगिन और सीमाओं की सेटिंग के बीच कोई समय खिड़की नहीं है।

पुराना हल

यहाँ एक बहुत ही सरल स्क्रिप्ट है जो काम करती है

#!/bin/bash

STATE=1 # 1 -- waiting for signal; 2 -- reading UID

dbus-monitor --system "interface=org.freedesktop.login1.Manager,member=UserNew" |
while read line
do
    case $STATE in
    1) [[ $line =~ member=UserNew ]] && STATE=2 ;;
    2) read dbus_type ID <<< $line
       systemctl set-property user-$ID.slice CPUAccounting=true
       STATE=1
    ;;
    esac
done

इसे प्रति उपयोगकर्ता मेमोरी सीमाओं का समर्थन करने के लिए आसानी से बढ़ाया जा सकता है।

वीएम पर 2 सीपीयू और 2 उपयोगकर्ताओं के साथ इसका परीक्षण किया। पहला उपयोगकर्ता रन dd if=/dev/zero of=/dev/null | dd if=/dev/zero of=/dev/nullकमांड और दूसरा केवल एक ही उदाहरण चलाता है dd। इस स्क्रिप्ट को चलाने के बिना, प्रत्येक उदाहरण में ddलगभग 70% सीपीयू का उपयोग किया जाता है।

फिर मैंने स्क्रिप्ट शुरू की, उपयोगकर्ताओं को ddफिर से लिखा, और फिर से आदेशों को रखा। इस बार ddपहले उपयोगकर्ता की दो प्रक्रियाओं में से प्रत्येक में केवल 50% CPU और दूसरे उपयोगकर्ता की प्रक्रिया में CPU का 100% हिस्सा लिया गया। इसके अलावा, systemd-cgtopदिखाया गया है, कि /user.slice/user-UID1.sliceऔर /user.slice/user-UID2.sliceप्रत्येक समय CPU का 100% हिस्सा लें, लेकिन पहले स्लाइस में 6 कार्य हैं और दूसरा केवल 5 कार्य हैं।

जब मैं ddदूसरे उपयोगकर्ता के कार्य को मारता हूं , तो पहला उपयोगकर्ता 200% सीपीयू समय का उपभोग करना शुरू कर देता है। इसलिए, हमारे पास कृत्रिम प्रतिबंधों के बिना उचित संसाधन आवंटन है जैसे "प्रत्येक उपयोगकर्ता केवल एक कोर का उपयोग कर सकता है"।



0

आपके द्वारा उल्लिखित मुद्दा अभी भी खुला है, लेकिन यह मेरे लिए काम करता है।

sudo systemctl edit --force user-1234.slice

फिर इसे टाइप करें और सेव करें:

[Slice]
CPUQuota=10%

मुझे यकीन नहीं है कि यह क्यों काम करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.