İşlem, zamanlanmış bir görev olarak etkileşimli olduğundan daha yavaş çalışır


41

Çok CPU ve GÇ yoğun olan ve çalışması yaklaşık dört saat süren (merak ediyorsanız kaynak kod oluşturma) zamanlanmış bir görevim var. Görevi, işini yapmak için çeşitli alt süreçleri ortaya çıkaran bir Powershell betiğidir. Aynı işlemi bir Powershell isteminden etkileşimli olarak çalıştırdığımda, aynı kullanıcı hesabıyla yaklaşık iki buçuk saat içinde çalışıyor. Görev, Windows Server 2008 R2'de çalışıyor.

Bilmek istediğim şey, zamanlanmış bir görev olarak çalışmanın neden bu kadar uzun sürdüğüdür - bir saatten uzun. Fark ettiğim bir şey, görev zamanlayıcısının Normalin Altında önceliğinde çalıştığından, görevim başladığında aynı indirgenmiş önceliği miras alıyor. Ancak, Powershell işlem önceliğini Normal olarak ayarlayacak betiği güncelledim ve hala bu kadar uzun sürüyor.

İki senaryo arasında neyin farklı olabileceği konusunda fikri olan var mı? İşlemci ve IO yükündeki farklılıkları göz ardı ettim - bu görev sistemin kullandığı tek şey, bu nedenle çalışan kaynaklar için rekabet edebilecek başka bir şey yok.


Herhangi bir güncelleme var mı? Ne bulabildiğini görmek çok merak ediyorum.
mfinni

Sebebinin ne olduğunu düşündüğümü buldum; cevabımı aşağıya bakınız.
Charlie

Windows 10 Fall Creators'tan itibaren bu sorun hala var ve @Jason Mathison'un geçici çözümü (Görev Zamanlayıcısı .xml dosyasını düzenle) hala en iyi çözüm.
BSalita

Yanıtlar:


36

Burada işte "normal" işlem önceliğinden daha fazlası olduğu anlaşılıyor. Soruda belirttiğim gibi, görev zamanlayıcısı varsayılan olarak görevinizi normal önceliğin altında çalıştırır. StackOverflow'taki bu soru , Normal öncelikte çalışacak herhangi bir görevin nasıl düzeltileceğini açıklar, ancak düzeltme yine de bir şeyi biraz farklı bırakır: bellek önceliği. Bellek önceliği, Windows Vista için yeni bir özellikti ve bu Technet makalesinde açıklandı . Herhangi bir yönetici veya programcı için olması gereken bir araç olan İşlem Gezgini'ni kullanarak bellek önceliğini görebilirsiniz .

Her neyse, zamanlanmış görev önceliği düzeltmesiyle bile, görevinizin bellek önceliği 4 olarak ayarlanmıştır, bu normal ayar 5 ayarının altındadır. Görevimin bellek önceliğini manuel olarak 5'e çıkardığımda performans açıktı. etkileşimli bir şekilde süreci çalıştırma.

Önceliği arttırma hakkında bilgi için, IO önceliği ile ilgili bir StackOverflow sorusuna verdiğim cevaba bakın ; bellek önceliği ayarının benzer şekilde NtSetInformationProcess aracılığıyla PROCESS_INFORMATION_CLASSayarlanması ile benzer şekilde yapılır ProcessMemoryPriority(bunun değeri 39 veya 0x27'dir). Başkalarının ihtiyacı varsa ve programcı araçlarına erişimi yoksa, bunu ayarlamak için kullanılabilecek ücretsiz bir yardımcı program yapabilirim.

EDIT: Devam ettim ve burada mevcut olan bir görevin bellek önceliğini sorgulamak ve ayarlamak için ücretsiz bir yardımcı program yazdım . İndirme hem kaynak kodunu hem de derlenmiş bir ikili dosya içeriyor.


Sen "Performans" sekmesini açarak, çalıştırılabilir programın adını çift tıklayarak Process Explorer bellek öncelik görebilir ve altında olabilir "Fiziksel Bellek" "Bellek Önceliği" için bir giriştir
Moshe

17

Sorun, işleminizin düşük bir G / Ç önceliği ve düşük bellek önceliği ile başlamasıdır. Bunu doğrulamanın en kolay yolu, sistem yöneticilerinden gelen işlem gezginleriyle. Bu zamanlanmış görevden kaynaklanan işlemlerin herhangi birinin özelliklerine bakarsanız, bunun G / Ç önceliği düşük ve bellek önceliği 2'nin olduğunu görürsünüz.

İşte bu sorunun çözümü:

  1. Görevi oluştur
  2. Göreve sağ tıklayın ve "dışa aktarın"
  3. Yeni verdiğiniz task.xml dosyasını düzenleyin
  4. Benzer bir çizgi bulacaksınız <Priority>7</Priority>
  5. Değeri normal bir önceliğe değiştirin (4-6 arasında). Potansiyel değerlerin bir tablosu: TaskSettings.Priority özelliği
    • 4 değeri, etkileşimli bir işlemle aynı G / Ç ve bellek önceliğine sahip olacaktır. 5 ve 6'nın değerleri daha düşük bellek önceliğine sahip olacak
  6. Görev zamanlayıcısında, başlangıçta oluşturduğunuz görevi silin
  7. Görev zamanlayıcısında, eylemler alanında, görevi XML dosyasından içe aktarın

Ne yazık ki, zamanlanmış görevlerin ilk önceliğini GUI'den değiştirmenin bir yolu yoktur.


Önerin için teşekkürler. Düzenli işlem önceliği ve G / Ç önceliği kesinlikle bunun bir parçasıdır ve diğer kısım hafıza önceliğidir. Daha fazla bilgi için kabul edilen cevaba bakın.
Charlie

Görevi bir XML dosyasına verdikten sonra, karakter kodlamasını Unicode'dan ANSI'ye değiştirmeniz gerekebilir. Windows Server 2008 R2'de, dışa aktarma bir Unicode dosyasıdır ve tekrar içeri aktarmayı denediğinizde hata mesajı The format of the task is not valid. The following error was reported: (1,2)::verilir. Dosyayı ANSI'ye kaydetmek benim için çözdü.
Erik Anderson,

Çok teşekkürler, bu gerçekten en iyi çözüm. Belgelerde belirtildiği gibi, daha yüksek CPU önceliği elde etmek için Önceliği daha da yüksek (en az 1) ayarlayabilirsiniz.
Rune Aamodt

Bu kayıt defterinde ince ayar yapabileceğinizi düşünen biri için, rahatsız etmeyin, orada güzel bir düzenlenebilir şekilde görünmüyor.
Nik

1

Kullanıcı X olarak zamanlanmış bir görev olarak çalışacak şekilde ayarlandıysa ve çalıştırılması gerekmeden önce Kullanıcı X olarak giriş yaptıysanız, çalıştırıldığında oturumunuzda bir pencere açması gerekir, oturumunuzda çalışacaktır.

Bunu yaparsanız, zaman süresinin daha uzun veya daha kısa sürmesi gerekir mi? Bunun ne anlama geldiğini bilmiyorum, ama faydalı bir farklılaştırıcı olabilir. Oturum açıldığında kullanıcı hesabının sahip olduğu bazı ağ erişimi olabilir, ancak zamanlanmış ve başarısız olması gereken zamanlanmış bir görev olarak çalışırken değil mi? Yeni bir kullanıcı hesabı oluşturduysanız ve bu hesap altında zamanlanmış bir görev olarak çalıştırıyorsanız, davranış farklı mı?

Başka bir fikir: Zamanlanmış bir görev olarak çalıştırırken - şimdi betiğinizde önceliği belirlediğiniz için alt işlemler tümü Normal veya Normalin altında mı çalışıyor?


1
Alt işlemler, procexp / taskman tarafından doğrulandığı gibi kesinlikle Normal olarak çalışır. Bence ağ işi değil, çünkü herhangi bir ağ erişimini sağlamıyor, fakat bunu iki kez kontrol edeceğim. Görevi etkileşimli olarak çalıştırma fikri de ilginç, onu deneyeceğim.
Charlie,

Sürecin kendisi, bunun bir sorun olması için bildiğiniz herhangi bir ağ erişimini yapmak zorunda değildir. Bu yazıyı Sysinternals'dan okuyun ve ilgisiz görünen bir şeyin nasıl sarkma / yavaşlamaya neden olabileceğini görün. blogs.technet.com/b/markrussinovich/archive/2005/08/28/…
mfinni

1

Belki de zamanlanmış görevler varsayılan olarak daha düşük bir öncelikte çalışır.

prioYüksek önceliği zorlamak için kullanın .


Daha düşük önceliğe sahip olmaları konusunda haklısın, ama bahsettiğim gibi, ben zaten bunu açıkladım. Bilmediğim süreç önceliğinden başka bir öncelik yoksa.
Charlie,

0

ilk başta - normal öncelikten daha fazlasını kullanabilirsiniz (örneğin Yüksek)

ikinci olarak - anlamak zorundasınız, ön plan oturumu bazı kaynakları alır, esas olarak sabit disk IO ve hafızası böylece zamanlanmış görev daha az olur. net bir değerlendirme yapmak için, komut dosyası çalışırken powershell yaparken oturumu kapatmanız gerekir

ve ayrıca işlemleri hızlandırmak için birkaç sabit diskte daha fazla bellek / ramdrive / split çalışması kullanmayı deneyebilirsiniz


Fikirler için teşekkürler. Makinenin bol miktarda belleği ve G / Ç kapasitesi vardır, sorun yalnızca planlanmış görevler gibi etkileşimli olanlardan daha yavaş çalışmasıdır. Zamanlanmış görev çalışırken genellikle etkileşimli oturum açma oturumu yoktur, bu yüzden sorun da bu değil.
Charlie,

0

Bu soru bir süre önce ve 2008R2 Windows sunucusu için. Aynı soruyu sordum, ancak Windows 10 için. Windows 10'da (1703 ve 1809'da doğrulandı), yalnızca "Öncelik" in ithal edilen xml yoluyla 4 olarak ayarlanması aynı Temel Öncelik, Dinamik Öncelik, G / Ç Önceliği vermek için yeterlidir. ve etkileşimli olarak başlatılan bir işlem olarak Bellek Önceliği.


0

İşte önceliği ayarlamak için bir powershell pasajı (uzak bir powershell oturumunda çalışıyor!):

$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"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.