Quá trình chạy chậm hơn như một nhiệm vụ theo lịch trình so với nó tương tác


41

Tôi có một tác vụ theo lịch trình rất tốn CPU và IO, và mất khoảng bốn giờ để chạy (xây dựng mã nguồn, nếu bạn tò mò). Nhiệm vụ này là một kịch bản Powershell, tạo ra các quy trình con khác nhau để thực hiện công việc của nó. Khi tôi chạy cùng một quá trình tương tác từ một dấu nhắc Powershell, như cùng một tài khoản người dùng, nó sẽ chạy trong khoảng hai tiếng rưỡi. Tác vụ đang chạy trên Windows Server 2008 R2.

Những gì tôi muốn biết là tại sao phải mất nhiều thời gian hơn để chạy như một nhiệm vụ theo lịch trình - lâu hơn một giờ. Một điều tôi nhận thấy là bộ lập lịch tác vụ chạy ở mức ưu tiên Dưới-Bình thường, vì vậy khi tác vụ của tôi bắt đầu, nó sẽ kế thừa mức ưu tiên thấp hơn. Tuy nhiên, tôi đã cập nhật tập lệnh để đặt mức ưu tiên của quy trình Powershell trở lại Bình thường và nó vẫn chỉ mất nhiều thời gian.

Bất cứ ai cũng có một ý tưởng những gì có thể khác nhau giữa hai kịch bản? Tôi đã loại trừ sự khác biệt về bộ xử lý và tải IO - nhiệm vụ này là thứ duy nhất mà hệ thống được sử dụng, vì vậy không có gì khác có thể cạnh tranh tài nguyên.


Bất cứ cập nhập nào? Tôi rất tò mò muốn xem những gì bạn có thể tìm thấy.
mfinni

Tôi đã tìm thấy những gì tôi nghĩ là nguyên nhân; xem câu trả lời của tôi dưới đây
Charlie

Kể từ Windows 10 Fall Creators, vấn đề này vẫn tồn tại và cách giải quyết của @Jason Mathison (chỉnh sửa tệp .xml của Trình lập lịch tác vụ) vẫn là giải pháp tốt nhất.
BSalita

Câu trả lời:


36

Dường như có nhiều ưu tiên quá trình "thông thường" tại nơi làm việc ở đây. Như tôi đã lưu ý trong câu hỏi, bộ lập lịch nhiệm vụ theo mặc định chạy nhiệm vụ của bạn ở mức thấp hơn mức ưu tiên bình thường. Câu hỏi này trên StackOverflow mô tả cách sửa bất kỳ tác vụ nào để chạy ở mức ưu tiên Bình thường, nhưng cách khắc phục vẫn để lại một điều hơi khác: ưu tiên bộ nhớ. Ưu tiên bộ nhớ là một tính năng mới cho Windows Vista và được mô tả trong bài viết Technet này . Bạn có thể thấy mức độ ưu tiên của bộ nhớ khi sử dụng Process Explorer , đây là công cụ bắt buộc phải có đối với bất kỳ quản trị viên hoặc lập trình viên nào.

Dù sao, ngay cả với sửa lỗi ưu tiên tác vụ theo lịch trình, mức độ ưu tiên bộ nhớ của tác vụ của bạn được đặt thành 4, thấp hơn một chút so với cài đặt thông thường là 5. Khi tôi tăng thủ công mức ưu tiên bộ nhớ lên 5, hiệu suất sẽ được bật ngang bằng với việc chạy quá trình tương tác.

Để biết thông tin về việc tăng mức độ ưu tiên, hãy xem câu trả lời của tôi cho câu hỏi StackOverflow liên quan về mức độ ưu tiên IO; thiết lập mức độ ưu tiên của bộ nhớ được thực hiện tương tự, thông qua NtInIn informationProcess, với giá trị PROCESS_INFORMATION_CLASSđược đặt thành ProcessMemoryPriority(giá trị của giá trị này là 39 hoặc 0x27). Tôi có thể tạo một tiện ích miễn phí có thể được sử dụng để thiết lập tiện ích này, nếu người khác cần nó và không có quyền truy cập vào các công cụ lập trình.

EDIT: Tôi đã đi trước và viết một tiện ích miễn phí để truy vấn và đặt mức độ ưu tiên bộ nhớ của một tác vụ, có sẵn ở đây . Tải về chứa cả mã nguồn và nhị phân được biên dịch.


Bạn có thể thấy mức độ ưu tiên của bộ nhớ trong Process Explorer bằng cách nhấp đúp vào tên của tệp thực thi, mở tab "Hiệu suất" và trong "Bộ nhớ vật lý" là mục nhập cho "Ưu tiên bộ nhớ"
Moshe

17

Vấn đề là quá trình của bạn đang bắt đầu với mức ưu tiên I / O thấp và mức độ ưu tiên bộ nhớ thấp. Cách dễ nhất để xác minh điều này là với trình thám hiểm quy trình từ sysiternals. Nếu bạn nhìn vào các thuộc tính của bất kỳ quy trình nào được sinh ra từ tác vụ theo lịch trình này, bạn sẽ thấy rằng nó có mức ưu tiên I / O thấp và mức ưu tiên bộ nhớ là 2.

Đây là giải pháp cho vấn đề này:

  1. Tạo nhiệm vụ
  2. Nhấp chuột phải vào nhiệm vụ và "xuất" nó
  3. Chỉnh sửa tệp task.xml mà bạn vừa xuất
  4. Bạn sẽ tìm thấy một dòng tương tự như <Priority>7</Priority>
  5. Thay đổi giá trị thành mức ưu tiên bình thường (trong khoảng từ 4 - 6). Một bảng các giá trị tiềm năng: Thuộc tính TaskSinstall.P Warriority
    • Giá trị 4 sẽ có cùng mức ưu tiên I / O và bộ nhớ như một quy trình tương tác. Giá trị 5 và 6 sẽ có mức ưu tiên bộ nhớ thấp hơn
  6. Trong lịch trình tác vụ, xóa tác vụ bạn đã tạo ban đầu
  7. Trong trình lập lịch tác vụ, trong vùng hành động, nhập tác vụ từ tệp XML

Thật không may, không có cách nào để sửa đổi mức độ ưu tiên ban đầu của các tác vụ theo lịch trình từ GUI.


Cám ơn vì sự gợi ý. Ưu tiên quá trình thường xuyên và ưu tiên IO chắc chắn là một phần của nó và phần khác là ưu tiên bộ nhớ. Xem câu trả lời được chấp nhận để biết thêm.
Charlie

Sau khi xuất tác vụ sang tệp XML, bạn có thể cần thay đổi mã hóa ký tự từ Unicode sang ANSI. Trên Windows Server 2008 R2, xuất là tệp Unicode và khi bạn cố gắng nhập lại, thông báo lỗi The format of the task is not valid. The following error was reported: (1,2)::được đưa ra. Lưu tệp vào ANSI giải quyết nó cho tôi.
Erik Anderson

Cảm ơn bạn rất nhiều, đây thực sự là giải pháp tốt nhất. Như các tài liệu đã đề cập, bạn cũng có thể đặt Mức độ ưu tiên cao hơn (ít nhất là tới 1), để có mức độ ưu tiên CPU cao hơn.
Rune Aamodt

Đối với bất cứ ai nghĩ rằng bạn có thể có thể điều chỉnh điều này trong sổ đăng ký, đừng bận tâm, dường như không có ở đó một cách có thể chỉnh sửa độc đáo.
Nik

1

Nếu bạn đặt nó chạy như một tác vụ theo lịch trình là Người dùng X, sau đó đăng nhập với tên Người dùng X trước khi chạy, nó sẽ mở một cửa sổ trong phiên của bạn khi nó chạy, nó sẽ chạy trong phiên của bạn.

Nếu bạn làm điều này, nó sẽ mất nhiều thời gian hơn, hoặc ngắn hơn, thời gian? Tôi không biết điều này có nghĩa là gì, nhưng nó có thể là một điểm khác biệt hữu ích. Có thể có một số quyền truy cập mạng mà tài khoản người dùng có khi đăng nhập, nhưng không phải khi chạy như một tác vụ theo lịch trình, điều đó cần phải hết thời gian và không thành công? Hành vi có khác không nếu bạn tạo tài khoản người dùng mới và chạy nó dưới dạng tác vụ theo lịch trình trong tài khoản đó?

Một ý tưởng khác: Khi chạy nó như một tác vụ theo lịch trình - bây giờ bạn đã sửa mức độ ưu tiên trên tập lệnh của mình, tất cả các quy trình phụ có chạy như Bình thường hoặc Dưới-Bình thường không?


1
Các quy trình con chắc chắn chạy như Bình thường, như được xác minh bởi procexp / taskman. Tôi nghĩ rằng điều mạng không phải là nó, bởi vì nó không thực hiện bất kỳ truy cập mạng thực sự nào, nhưng tôi sẽ kiểm tra kỹ điều đó. Ý tưởng về việc chạy tác vụ như tương tác cũng thú vị, tôi sẽ thử.
Charlie

Bản thân quá trình không phải thực hiện bất kỳ truy cập mạng nào mà bạn biết về vấn đề này. Đọc bài đăng này từ Sysiternals và xem làm thế nào một cái gì đó dường như không liên quan có thể gây ra treo / chậm. blog.technet.com/b/markrussinovich/archive/2005/08/28/ trên
mfinni

1

Có thể các tác vụ theo lịch trình chạy ở mức ưu tiên thấp hơn theo mặc định.

Sử dụng priođể buộc ưu tiên cao hơn.


Bạn đúng khi họ chạy ở mức ưu tiên thấp hơn, nhưng như tôi đã đề cập, tôi đã tính đến điều đó. Trừ khi có một số ưu tiên khác ngoài ưu tiên quá trình mà tôi không biết.
Charlie

0

lúc đầu - bạn có thể sử dụng nhiều hơn mức ưu tiên bình thường (ví dụ Cao)

ở lần thứ hai - bạn phải hiểu, hơn phiên foreground cần một số tài nguyên, chủ yếu là IO đĩa cứng và bộ nhớ để tác vụ theo lịch trình trở nên ít hơn. để có điểm chuẩn rõ ràng, bạn phải đăng xuất trong khi bạn chạy tập lệnh

và bạn cũng có thể thử thêm bộ nhớ / sử dụng ramdrive / split work trên một số đĩa cứng để tăng tốc quá trình


Cảm ơn các ý tưởng. Máy có nhiều bộ nhớ và dung lượng IO, vấn đề chỉ là mọi thứ chạy chậm hơn như các tác vụ theo lịch trình so với khi chúng tương tác. Khi tác vụ theo lịch trình đang chạy, thường không có phiên đăng nhập tương tác, vì vậy tôi nghĩ đó cũng không phải là vấn đề.
Charlie

0

Câu hỏi này là từ một thời gian trước, và cho máy chủ windows 2008R2. Tôi cũng có câu hỏi tương tự, nhưng đối với Windows 10. Trên Windows 10 (đã được xác minh trên 1703 và 1809), chỉ cần đặt "Ưu tiên" thành 4 qua xml đã nhập là đủ để cung cấp cho bạn Ưu tiên cơ bản, Ưu tiên động, Ưu tiên I / O và Ưu tiên bộ nhớ như một quá trình bắt đầu tương tác.


0

Đây là đoạn trích quyền hạn để đặt mức độ ưu tiên (hoạt động trong phiên quyền hạn từ xa!):

$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"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.