2009-03-31 1 views
13

मैं पाइथन उपप्रोसेसेस का एक विशेष सेट जितना संभव हो उतना कम प्रभाव वाला होना चाहता हूं। मैं सीपीयू खपत को सीमित करने में मदद के लिए पहले से ही nice का उपयोग कर रहा हूं। लेकिन आदर्श I/O भी सीमित होगा। (यदि संदिग्ध है, तो कृपया मुझे हास्य दें और मान लें कि ऐसा करने में मूल्य है; इससे कोई फर्क नहीं पड़ता कि वे कितने समय तक दौड़ते हैं, उनमें से बहुत से हो सकते हैं, और उच्च प्राथमिकता वाली सामग्री (आमतौर पर) चल रही है एक ही मशीन, आदि)पायथन प्रक्रियाओं (संभवतः आयनिस का उपयोग करके) I/O खपत को कैसे सीमित करें?

एक संभावना ionice प्रतीत होता है। ionice (Google ने कुछ भी चालू नहीं किया है) का आह्वान करने के लिए कोई मौजूदा पायथन पैकेज हैं? ionice कमांड को चलाने के लिए कोड लिखना मुश्किल नहीं होगा; लेकिन मैं लेखन कोड से बचना पसंद करूंगा कि किसी और ने लिखा है/परीक्षण किया है; कभी-कभी सूक्ष्म किनारे के मामले होते हैं, और, क्या आई/ओ खपत को सीमित करने का एक बेहतर तरीका है?

man page for ionice पता चलता है कि ionice मूल्य nice मूल्य से प्रभावित हो सकते हैं, लेकिन यह अजगर 2.6 स्क्रिप्ट का खंडन करने के लिए, यहां तक ​​कि बच्चे प्रक्रियाओं जहां nice मूल्य विरासत में मिलती है के लिए प्रकट होता है चल रहा है:

#!/usr/bin/env python 

import os 
import multiprocessing 

def print_ionice(name): 
    print '*** ', name, ' ***' 
    os.system("echo -n 'nice: '; nice") 
    os.system("echo -n 'ionice: '; ionice -p%d" % os.getpid()) 

for niced in (None, 19): 
    if niced: os.nice(niced) 
    print '**** niced to: ', niced, ' ****' 
    print_ionice('parent') 
    subproc = multiprocessing.Process(target=print_ionice, args=['child']) 
    subproc.start() 
    subproc.join() 

है कौन सा निम्नलिखित उत्पादन:

 
$ uname -as 
Linux x.fake.org 2.6.27-11-server #1 SMP Thu Jan 29 20:13:12 UTC 2009 x86_64 GNU/Linux 
$ ./foo.py 
**** niced to: None **** 
*** parent *** 
nice: 0 
ionice: none: prio 4 
*** child *** 
nice: 0 
ionice: none: prio 4 
**** niced to: 19 **** 
*** parent *** 
nice: 19 
ionice: none: prio 4 
*** child *** 
nice: 19 
ionice: none: prio 4 

उत्तर

14

psutil इस कार्यक्षमता को उजागर करता है (अजगर 2.4 -> 3.2) है: मैं प्रभावी रूप से http://bugs.python.org/issue10784

+0

कूल फिक्स, इच्छा है कि यह ओएसएक्स के लिए उपलब्ध था। –

+0

हाँ ... दुर्भाग्य से ओएसएक्स इसे मूल रूप से बेनकाब नहीं करता है। –

+0

सुनिश्चित करें कि आपके ब्लॉक डिवाइस में सीएफक्यू शेड्यूलर है। अन्यथा यह काम नहीं करेगा। – Zorg

3

क्यों जो कुछ शुरूआत प्रक्रियाओं उन पर ionice कर (यानी, आर नहीं उन्हें आयनिस के साथ अनियंत्रित करने के बजाय उन्हें आयनिस? यह एक बहुत साफ क्लीनर लगता है।

+0

:

import psutil, os p = psutil.Process(os.getpid()) p.ionice(psutil.IOPRIO_CLASS_IDLE) 

इसके अलावा, अजगर 3.3 से शुरू इस अजगर stdlib में भी उपलब्ध हो जाएगा फोर्क करना चाहते हैं और निष्पादित नहीं करना चाहते हैं (उदाहरण के लिए, 'मल्टीप्रोसेसिंग' मॉड्यूल का उपयोग करना); अनिश्चित जहां आयनिस वहां फिट होगा। बच्चे * * ionice -p -cblah (स्वयं पर, उदाहरण के लिए, os.system का उपयोग कर) को कॉल कर सकते हैं। –

5

एचएम।

प्रारंभ सूचक के रूप में, आपको syscall संख्या ioprio_set और ioprio_get सिस्टम आपके कर्नेल में कॉल करनी चाहिए। मेरा सुझाव है कि आप अपने कर्नेल आर्क के आधार पर /usr/include/asm/unistd_32.h या /usr/include/asm/unistd_64.h में चेक करें; यदि नहीं, तो syscall(2) मैन पेज के सुझाव से शुरू करें, जो /usr/include/sys/syscall.h होना चाहिए और अपना रास्ता नीचे शामिल करना चाहिए।

यह देखते हुए कि, आप ctypes का उपयोग करना चाहिए, ए ला:

def ioprio_set(which, who, ioprio): 
    rc= ctypes.CDLL('libc.so.6').syscall(289, which, who, ioprio) 
    # some error checking goes here, and possibly exception throwing 

, यह है कि कम या ज्यादा। मज़ा :)

संबंधित मुद्दे