प्रक्रिया एक शेड्यूल किए गए कार्य की तुलना में धीमी गति से चलती है क्योंकि यह अंतःक्रियात्मक रूप से कार्य करता है


41

मेरे पास एक निर्धारित कार्य है जो बहुत CPU- और IO- गहन है, और चलाने में लगभग चार घंटे लगते हैं (स्रोत कोड का निर्माण, यदि आप घुमावदार हैं)। कार्य एक पॉवर्सशेल स्क्रिप्ट है जो अपना काम करने के लिए विभिन्न उप-प्रक्रियाओं को जन्म देती है। जब मैं एक ही प्रक्रिया को पॉवर्सशेल प्रॉम्प्ट से एक ही उपयोगकर्ता खाते के रूप में अंतःक्रियात्मक रूप से चलाता हूं, तो यह लगभग ढाई घंटे में चलती है। कार्य Windows Server 2008 R2 पर चल रहा है।

मैं जानना चाहता हूं कि एक निर्धारित कार्य के रूप में चलने में इतना समय क्यों लगता है - एक घंटे से अधिक समय तक। एक बात मैंने देखी कि टास्क शेड्यूलर नीचे-सामान्य प्राथमिकता पर चलता है, इसलिए जब मेरा कार्य शुरू होता है, तो यह उसी निचली प्राथमिकता को प्राप्त करता है। हालाँकि, मैंने Powershell प्रक्रिया प्राथमिकता को वापस सामान्य पर सेट करने के लिए स्क्रिप्ट को अपडेट किया है, और यह अभी भी लंबे समय के रूप में लेता है।

किसी को भी इस बात का अंदाजा है कि दोनों परिदृश्यों के बीच क्या अंतर हो सकता है? मैंने प्रोसेसर और आईओ लोड में अंतर को खारिज कर दिया है - यह कार्य केवल एक चीज है जिसके लिए सिस्टम का उपयोग किया जाता है, इसलिए कुछ और नहीं चल रहा है जो संसाधनों के लिए प्रतिस्पर्धा कर सकता है।


कोई सुधार? मैं यह देखने के लिए बहुत उत्सुक हूं कि आप क्या पा सकते हैं।
एमफिनि

मुझे लगता है कि मुझे लगता है कि इसका कारण क्या था; नीचे मेरा जवाब देखें।
चार्ली

विंडोज 10 फॉल क्रिएटर्स के रूप में, यह समस्या अभी भी मौजूद है और @ जैसन मैथिसन का वर्कअराउंड (टास्क शेड्यूलर .xml फ़ाइल संपादित करें) अभी भी सबसे अच्छा समाधान है।
बसालिता

जवाबों:


36

ऐसा प्रतीत होता है कि यहां काम पर "नियमित" प्रक्रिया से अधिक प्राथमिकता है। जैसा कि मैंने प्रश्न में उल्लेख किया है, डिफ़ॉल्ट रूप से कार्य अनुसूचक सामान्य प्राथमिकता से कम पर आपका कार्य चलाता है। StackOverflow पर यह प्रश्न बताता है कि किसी भी कार्य को सामान्य प्राथमिकता पर चलाने के लिए कैसे ठीक किया जाए, लेकिन यह फिक्स अभी भी एक चीज़ को थोड़ा अलग करता है: मेमोरी प्राथमिकता। मेमोरी प्राथमिकता विंडोज विस्टा के लिए एक नई सुविधा थी, और इस तकनीकी लेख में वर्णित है । आप प्रोसेस एक्सप्लोरर का उपयोग करके मेमोरी प्राथमिकता देख सकते हैं , जो कि किसी भी व्यवस्थापक या प्रोग्रामर के लिए आवश्यक उपकरण है।

वैसे भी, निर्धारित कार्य प्राथमिकता निर्धारण के साथ, आपके कार्य की मेमोरी प्राथमिकता 4 पर सेट है, जो कि सामान्य सेटिंग 5 से एक पायदान नीचे है। जब मैंने मैन्युअल रूप से अपने कार्य की मेमोरी प्राथमिकता 5 तक बढ़ा दी थी, तो प्रदर्शन चालू था अंतःक्रियात्मक रूप से चलाने के साथ।

प्राथमिकता बढ़ाने की जानकारी के लिए, IO प्राथमिकता के बारे में संबंधित स्टैकऑवरफ्लो प्रश्न के बारे में मेरा उत्तर देखें ; मेमोरी प्राथमिकता PROCESS_INFORMATION_CLASSनिर्धारित करने के समान, NtSetInformationProcess के माध्यम से किया जाता है, सेट के साथ ProcessMemoryPriority(इस का मूल्य 39 या 0x27 है)। मैं एक मुफ्त उपयोगिता बना सकता हूं जिसका उपयोग इसे सेट करने के लिए किया जा सकता है, अगर दूसरों को इसकी आवश्यकता है और प्रोग्रामर टूल तक पहुंच नहीं है।

संपादित करें: मैं आगे बढ़ चुका हूं और किसी कार्य की मेमोरी प्राथमिकता को निर्धारित करने, यहां उपलब्ध कराने के लिए एक मुफ्त उपयोगिता लिखी है । डाउनलोड में स्रोत कोड और संकलित बाइनरी दोनों शामिल हैं।


आप निष्पादन योग्य के नाम पर डबल क्लिक करके, "प्रदर्शन" टैब खोलकर मेमोरी एक्सप्लोरर में मेमोरी प्राथमिकता देख सकते हैं, और "फिजिकल मेमोरी" के तहत "मेमोरी प्रायोरिटी" के लिए एक प्रविष्टि है
मोशे

17

मुद्दा यह है कि आपकी प्रक्रिया कम I / O प्राथमिकता और कम मेमोरी प्राथमिकता के साथ शुरू हो रही है। इसे सत्यापित करने का सबसे आसान तरीका sysinternals से प्रोसेस एक्सप्लोरर के साथ है। यदि आप इस निर्धारित कार्य से उत्पन्न किसी भी प्रक्रिया के गुणों को देखते हैं, तो आप देखेंगे कि इसमें 2 की निम्न और स्मृति प्राथमिकता I / O प्राथमिकता है।

यहाँ इस मुद्दे का हल है:

  1. कार्य बनाएँ
  2. कार्य पर राइट क्लिक करें और इसे "निर्यात" करें
  3. टास्क को संपादित करें। xml फ़ाइल जिसे आपने अभी निर्यात किया है
  4. आपको इसी तरह की एक लाइन मिलेगी <Priority>7</Priority>
  5. मान को एक सामान्य प्राथमिकता में बदलें (4-6 के बीच)। संभावित मूल्यों की एक तालिका: टास्कसेटिंग्स.पायरिटी प्रॉपर्टी
    • 4 के मूल्य में समान I / O और मेमोरी प्राथमिकता एक संवादात्मक प्रक्रिया के रूप में होगी। 5 और 6 के मान से मेमोरी की प्राथमिकता कम होगी
  6. कार्य शेड्यूलर में, आपके द्वारा शुरू किए गए कार्य को हटा दें
  7. कार्य शेड्यूलर में, क्रिया क्षेत्र में, XML फ़ाइल से कार्य आयात करें

दुर्भाग्य से GUI से निर्धारित कार्यों की प्रारंभिक प्राथमिकता को संशोधित करने का कोई तरीका नहीं है।


सलाह के लिये धन्यवाद। नियमित प्रक्रिया प्राथमिकता और IO प्राथमिकता निश्चित रूप से इसका हिस्सा है, और दूसरा हिस्सा मेमोरी प्राथमिकता है। अधिक जानकारी के लिए स्वीकृत उत्तर देखें।
चार्ली

XML फ़ाइल में कार्य को निर्यात करने के बाद, आपको यूनिकोड से ANSI में वर्ण एन्कोडिंग को बदलने की आवश्यकता हो सकती है। Windows Server 2008 R2 पर, निर्यात एक यूनिकोड फ़ाइल है और जब आप इसे वापस आयात करने का प्रयास करते हैं, तो त्रुटि संदेश The format of the task is not valid. The following error was reported: (1,2)::दिया जाता है। फ़ाइल को एएनएसआई में सहेजना मेरे लिए इसे हल करता है।
एरिक एंडरसन

बहुत बहुत धन्यवाद, यह वास्तव में सबसे अच्छा समाधान है। डॉक्स का उल्लेख करते हुए, आप उच्च CPU प्राथमिकता प्राप्त करने के लिए प्राथमिकता को और भी अधिक (कम से कम 1 तक) सेट कर सकते हैं।
रूण आमोद

यह सोचकर कि आप रजिस्ट्री में इसे शामिल कर सकते हैं, परेशान न हों, ऐसा प्रतीत नहीं होता कि यह एक अच्छा संपादन योग्य तरीका है।
निक

1

यदि आप इसे उपयोगकर्ता एक्स के रूप में एक निर्धारित कार्य के रूप में चलाने के लिए सेट करते हैं, और फिर इसे चलाने से पहले उपयोगकर्ता एक्स के रूप में लॉगिन करते हैं, तो इसे आपके सत्र में एक विंडो खोलनी चाहिए जब यह चलता है, तो यह आपके सत्र में चल रहा होगा।

यदि आप ऐसा करते हैं, तो यह अधिक समय लेती है, या कम, समय की अवधि? मुझे नहीं पता कि इसका क्या मतलब होगा, लेकिन यह एक उपयोगी विभेदक हो सकता है। क्या कुछ नेटवर्क एक्सेस हो सकता है जो उपयोगकर्ता खाते में लॉग इन करते समय किया गया हो, लेकिन निर्धारित कार्य के रूप में नहीं चलने पर, जिसे टाइमआउट और विफल होने की आवश्यकता है? यदि आप एक नया उपयोगकर्ता खाता बनाते हैं और क्या यह उस खाते के तहत एक निर्धारित कार्य के रूप में चला है, तो व्यवहार अलग है?

एक और विचार: जब इसे एक निर्धारित कार्य के रूप में चलाया जा रहा है - अब जब आपने अपनी स्क्रिप्ट पर प्राथमिकता तय कर ली है, तो सब-प्रक्रियाएँ सामान्य, या नीचे-सामान्य के रूप में चलती हैं?


1
सबप्रोसेस निश्चित रूप से नॉर्म के रूप में चलते हैं, जैसा कि प्रॉक्सेप / टास्कमैन द्वारा सत्यापित है। मुझे लगता है कि नेटवर्क की बात यह नहीं है, क्योंकि यह किसी भी मूल नेटवर्क का उपयोग नहीं करता है, लेकिन मैं इसकी दोहरी जांच करूंगा। इंटरैक्टिव के रूप में कार्य चलाने के बारे में विचार भी दिलचस्प है, मैं इसे आज़माऊंगा।
चार्ली

इस प्रक्रिया में किसी भी नेटवर्क का उपयोग करने की आवश्यकता नहीं है जिसे आप जानते हैं कि यह एक समस्या है। Sysinternals की इस पोस्ट को पढ़ें और देखें कि कैसे प्रतीत होता है कि असंबंधित कोई चीज हैंग / स्लोनेस पैदा कर सकती है। blogs.technet.com/b/markrussinovich/archive/2005/08/28/…
mfinni

1

शायद शेड्यूल किए गए कार्य डिफ़ॉल्ट रूप से कम प्राथमिकता पर चलते हैं।

prioउच्च प्राथमिकता के लिए मजबूर करने के लिए उपयोग करें ।


आप सही हैं कि वे कम प्राथमिकता पर चलते हैं, लेकिन जैसा कि मैंने उल्लेख किया है, मैं पहले से ही इसके लिए जिम्मेदार हूं। जब तक प्रक्रिया प्राथमिकता के अलावा कुछ प्राथमिकता नहीं होती है जिसके बारे में मुझे जानकारी नहीं है।
चार्ली

0

पहली बार में - आप सामान्य प्राथमिकता से अधिक उपयोग कर सकते हैं (उदाहरण के लिए उच्च)

दूसरे पर - आपको यह समझना होगा कि अग्रभूमि सत्र की तुलना में कुछ संसाधन लगते हैं, मुख्य रूप से हार्ड आईओ और मेमोरी इसलिए निर्धारित कार्य कम हो जाता है। स्पष्ट बेंचमार्क के लिए आपको स्क्रिप्ट चलाने के दौरान लॉगऑफ करना होगा

और आप प्रक्रियाओं को गति देने के लिए कई हार्ड डिस्क पर अधिक मेमोरी जोड़ने / रामड्राइव / स्प्लिट वर्क का उपयोग करने का प्रयास कर सकते हैं


विचारों के लिए धन्यवाद। मशीन में बहुत मेमोरी और IO क्षमता है, समस्या सिर्फ इतनी है कि चीजें धीमी गति से चलती हैं क्योंकि वे निर्धारित कार्यों की तुलना में अंतःक्रियात्मक रूप से करते हैं। जब निर्धारित कार्य चल रहा होता है, तो आमतौर पर कोई इंटरैक्टिव लॉगऑन सत्र नहीं होता है, इसलिए मुझे लगता है कि यह मुद्दा नहीं है।
चार्ली

0

यह सवाल कुछ समय पहले से है, और विंडोज़ सर्वर 2008R2 के लिए। मेरे पास एक ही सवाल था, लेकिन विंडोज 10 के लिए। विंडोज 10 पर (1703 और 1809 पर सत्यापित), आयातित एक्सएमएल के माध्यम से "प्राथमिकता" को 4 पर सेट करना आपको एक ही आधार प्राथमिकता, डायनेमिक प्राथमिकता, I / O प्राथमिकता देने के लिए पर्याप्त है। , और मेमोरी प्रायोरिटी एक संवादात्मक रूप से शुरू की गई प्रक्रिया के रूप में।


0

प्राथमिकता निर्धारित करने के लिए यहां एक शिलशिला स्निपेट है (एक रिमोट सेशेल सेशन में काम करता है!):

$taskName = "MyTask" ;`
$currentTask = Get-ScheduledTask -TaskName $taskName ;`
$settings = New-ScheduledTaskSettingsSet ;`
$settings.Priority = 4 ;`
Set-ScheduledTask -TaskName $taskName -Trigger $currentTask.Triggers -Action $currentTask.Actions -Settings $settings -User "NT AUTHORITY\SYSTEM"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.