स्थायी रूप से दी गई प्रक्रिया के लिए सीपीयू सीमा कैसे निर्धारित करें। Cpulimit और अच्छा काम नहीं करते


12

इसी तरह के कई सवाल हैं, लेकिन उनमें से कोई भी मेरी समस्या के लिए मेरी मदद नहीं करता है।

मेरे पास सर्वर पर ubuntu 11.10 है (यह डेस्कटॉप संस्करण है)। मेरे पास इस पर एक रनिंग वेबसाइट है। एक प्रक्रिया है जो बहुत महत्वपूर्ण है, लेकिन उच्च प्राथमिकता पर चलना नहीं है। मैं प्रक्रिया के लिए CPU उपयोग को स्थायी रूप से सीमित करना चाहता हूं , उपयोगकर्ता के लिए नहीं। यह प्रक्रिया निष्पादन फ़ंक्शन द्वारा संचालित होती है (यह php फ़ंक्शन है, सिस्टम प्रक्रिया नहीं)।

इसलिए मुझे 2 विकल्प दिखाई देते हैं: 1. हर बार फ़ंक्शन निष्पादित होने पर किसी प्रकार की सीमा जोड़ें। 2. इस प्रक्रिया के लिए स्थायी रूप से सीपीयू उपयोग को सीमित करें।

मैंने "अच्छा" और cpulimit का उपयोग करने की कोशिश की है, लेकिन कुछ भी काम नहीं करता है। नाइस का कोई प्रभाव नहीं है और cpulimit (-e) कहता है: "कोई लक्ष्य प्रक्रिया नहीं मिली"।

मैं काफी शुरुआती हूं, इसलिए कृपया मान लें कि मैं लगभग कुछ भी नहीं जानता हूं।


क्या आप हमें बता सकते हैं कि आपने क्या प्रयास किया है। cgroups आपके लिए यह कर सकते हैं।
पैंथर

कॉन्फ़िगरेशन के रूप में, आप cgsnapshot -sकॉन्फ़िगरेशन फ़ाइल को मैन्युअल रूप से लिखे बिना जानकारी को पुनः प्राप्त करने के लिए चला सकते हैं , जिसमें से बाद की सिफारिश नहीं की गई है।
मिंगलियांग लियू

क्या आप वास्तव में इस प्रक्रिया को समाप्त करना चाहते हैं, यानी सुनिश्चित करें कि यह कभी भी निर्धारित समय से अधिक हो?
केन शार्प

मैंने इस पद्धति का उपयोग किया और इसने मेरे लिए काम किया .. ubuntuforums.org/showthread.php?t=992706
मुस्तफा सलमान

जवाबों:


19

अनुरोधित विवरण के अभाव में ...

यहाँ मैं ubuntu पर cgroups का उपयोग कैसे करें।

इस पोस्ट के दौरान, आपको प्रक्रिया चलाने वाले उपयोगकर्ता को चर "$ USER" को बदलना होगा

मैंने मेमोरी के लिए जानकारी जोड़ी है और साथ ही यह एफएक्यू होने जा रहा है, अगर आपको इसकी आवश्यकता नहीं है तो इसका उपयोग न करें।

1) स्थापित करें cgroup-bin

sudo apt-get install cgroup-bin

2) रिबूट। cgroups अब स्थित है/sys/fs/cgroup

3) अपने उपयोगकर्ता (प्रक्रिया के स्वामी) के लिए एक समूह बनाएं

# Change $USER to the system user running your process.
sudo cgcreate -a $USER -g memory,cpu:$USER

4) आपका उपयोगकर्ता उन्हें संसाधनों का प्रबंधन कर सकता है। डिफ़ॉल्ट रूप से उपयोगकर्ताओं को 1024 cpu इकाइयां (शेयर) मिलती हैं, इसलिए लगभग 10% cpu तक सीमित करने के लिए, स्मृति बाइट्स में है ...

# About 10 % cpu
echo 100 > /cgroup/cpu/$USER/cpu.shares

# 10 Mb
echo 10000000 > /cgroup/memory/$USER/memory.limit_in_bytes

5) अपनी प्रक्रिया शुरू करें (cgexec पर अमल बदलें)

# -g specifies the control group to run the process in
# Limit cpu
cgexec -g cpu:$USER command <options> &

# Limit cpu and memory
cgexec -g memory,cpu:$USER command <options> &

विन्यास

मान लें कि आपके लिए cgroups काम कर रहे हैं;)

संपादित करें /etc/cgconfig.conf, अपने कस्टम cgroup में जोड़ें

# Graphical
gksudo gedit /etc/cgconfig.conf

# Command line
sudo -e /etc/cgconfig.conf

अपने cgroup में जोड़ें। प्रक्रिया का मालिक होने वाले उपयोगकर्ता नाम में फिर से USER बदलें।

group $USER {
# Specify which users can admin (set limits) the group
perm {    
    admin {
        uid = $USER;
    }
# Specify which users can add tasks to this group
    task {
        uid = $USER;
    }
}
# Set the cpu and memory limits for this group
cpu {
    cpu.shares = 100;
    }
memory {
    memory.limit_in_bytes = 10000000;
    }
}

आप समूहों को भी निर्दिष्ट कर सकते हैं gid=$GROUP, /etc/cgconfig.conf अच्छी तरह से टिप्पणी की गई है।

अब फिर से अपनी प्रक्रिया चलाएं cgexec -g cpu:$USER command <options>

आप अपनी प्रक्रिया (पीआईडी ​​द्वारा) में देख सकते हैं /sys/fs/cgroup/cpu/$USER/tasks

उदाहरण

बॉडी @ ufbt: ~ $ cgexec -g cpu: बॉडी स्लीप 100 &

[१] १४ ९९

बॉडी @ ufbt: ~ $ बिल्ली / एसआईएस / एफएस / cgroup / सीपीयू / बॉडी / कार्य

1499

अतिरिक्त जानकारी के लिए देखें: http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Resource_Management_Guide/


2
मैं भाग 1 को समाप्त करने में कामयाब रहा। यह काम कर रहा है, लेकिन आपको उस जानकारी को जोड़ना चाहिए जो प्रक्रिया केवल सीमित है जबकि कुछ अन्य प्रक्रिया में सीपीयू / मेमोरी की आवश्यकता है। यह स्पष्ट नहीं है - और मुझे यह पता लगाने में लंबा समय लगता है (जैसा कि मैं भिखारी हूं)। क्या मैं सही ढंग से समझता हूं कि "कॉन्फ़िगरेशन" रिबूट के बाद भी सेटिंग्स को बचाने के लिए है?
रफाल

1
खुशी है कि तुम्हें इसका हल मिल गया। वहाँ एक सीखने की अवस्था का एक सा है =) हाँ, विन्यास को बूटिंग के पार रखने के लिए है।
पैंथर

जब मैं कमांड लाइन से cgroup का उपयोग करता हूं तो यह ठीक काम करता है। लेकिन जब मैं php में निष्पादन कार्य से एक ही कमांड निष्पादित करता हूं: (<? Php exec ("cgexec -g cpu: GroupHere NameOfProcess InputFile OutputFile"); यह काम नहीं करता है। केवल अंतर यह है कि कमांड लाइन में मैं उन फ़ाइलों का उपयोग करता हूं जो अंदर हैं। फ़ोल्डर में हूँ और php से मैं उन फ़ाइलों के लिए लंबे पथ का उपयोग करता हूं। किसी भी विचार से क्या समस्या हो सकती है? मैं दोनों मामलों में एक ही उपयोगकर्ता का उपयोग करता हूं।
रफाल

1
@ रफाल: मैं नहीं कहता कि आपकी पहली टिप्पणी सही है, स्मृति सीमित होनी चाहिए, भले ही कोई अन्य प्रक्रिया बहुत अधिक स्मृति नहीं ले रही हो।
फ्लिम्प

1
@ फाल्म केवल 2 प्रक्रियाएं चल रही थीं जब मैं इस समाधान का परीक्षण कर रहा था - अपाचे और प्रक्रिया जो सीमित होनी चाहिए। जब कोई अपाचे कनेक्शन नहीं था या अपाचे के लिए केवल एक कनेक्शन था, तो उस सीमित प्रक्रिया ने 100% सीपीयू ले लिया। यह केवल एक बार अपाचे के लिए कई कनेक्शनों तक सीमित हो गया था (मैंने वेब ब्राउज़र से वेबसाइट को फिर से ताज़ा करके ऐसा किया था)। तो शायद यह कोई अन्य प्रक्रिया नहीं चल रही थी।
रफाल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.