Quiero aumentar la prioridad de E/S de un proceso. Las respuestas para .NET y Windows Vista estarían bien. processexplorer está bien también.¿Cómo se puede aumentar la prioridad de E/S de un proceso?
Respuesta
La información relevante parece estar un poco dispersa en comparación con la documentación habitual de MS. Hay este libro blanco que discute I/O Prioritization in windows. Este documento parece tener indicadores beta por todas partes, pero supongo que probablemente sea bastante preciso.
Dos cosas importantes a tener en cuenta:
- Sólo puede reducir la prioridad de las solicitudes IO debajo de lo normal.
- El controlador puede ignorar cualquier solicitud y tratarla como normal de todos modos.
Las API útiles para aplicaciones de cliente son SetFileInformationByHandle:
FILE_IO_PRIORITY_HINT_INFO priorityHint;
priorityHint.PriorityHint = IoPriorityHintLow;
result = SetFileInformationByHandle(hFile,
FileIoPriorityHintInfo,
&priorityHint,
sizeof(PriorityHint));
// reduce CPU, page and IO priority for the whole process
result = SetPriorityClass(GetCurrentProcess(),
PROCESS_MODE_BACKGROUND_BEGIN);
// do stuff
result = SetPriorityClass(GetCurrentProcess(),
PROCESS_MODE_BACKGROUND_END);
SetThreadPriority que es similar:
// reduce CPU, page and IO priority for the current thread
SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_BEGIN);
// do stuff
SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_END);
// reserve bandwidth of 200 bytes/sec
result = SetFileBandwidthReservation(hFile,
1000,
200,
FALSE,
&transferSize,
&outstandingRequests);
Para .Net haga las cosas habituales con P/Invoke.
Parece que la forma "real" de establecer la prioridad de IO de un proceso es utilizando NtSetInformationProcess
con la clase de información ProcessIoPriority
. Lamentablemente, esta API no está documentada, pero puede verla en acción al adjuntar un depurador a taskeng.exe y romper en ExeTask::GetYourPrioritiesStraight
.
creo que el valor PROCESS_INFORMATION_CLASS
para ProcessIoPriority
es 33 (0x21), y los valores de prioridad son las siguientes:
Very Low: 0
Low: 1
Normal: 2
High: 3 or above?
Los valores anteriores son una mejor suposición basada en lo que puedo decir desde el depurador; el planificador de tareas parece usar un valor de 1 para tareas con prioridad 7 y un valor de 2 para tareas con prioridad 5 (consulte this question y this MSDN article para obtener más información sobre las prioridades del planificador de tareas). Llamando SetPriorityClass
con PROCESS_MODE_BACKGROUND_BEGIN
utiliza un valor de 0.
he lamentablemente no se encuentra ninguna API pública que se puede utilizar para esto, que no sea el método SetPriorityClass
en respuesta @ 1800 de información, que establece la prioridad a muy bajo.
Editar: He escrito una utilidad que se puede usar para consultar o establecer la prioridad IO de un proceso, available here.
Apenas una actualización para esto - que todo se puede hacer a través de .NET sin recurrir a la API de Windows ...
// Set the current process to run at 'High' Priority
System.Diagnostics.Process process = System.Diagnostics.Process.GetCurrentProcess();
process.PriorityClass = System.Diagnostics.ProcessPriorityClass.High;
// Set the current thread to run at 'Highest' Priority
Thread thread = System.Threading.Thread.CurrentThread;
thread.Priority = ThreadPriority.Highest;
he probado el anterior establecimiento de la prioridad del proceso en una aplicación WPF y funciona bien . No he necesitado configurar la prioridad de subprocesos.
EDITAR: lo anterior se refiere a la prioridad de CPU de un proceso, en oposición a la prioridad de E/S; sin embargo, puede haber alguna correlación/conexión entre la prioridad de CPU de un proceso y su prioridad de E/S.
No parece haber un equivalente de .NET de SetFileInformationByHandle para cambiar la prioridad de IO, sin embargo, como se señala en 1800 INFORMATION, esta API solo le permite reducir la prioridad a menos de lo normal. – eodabash
¿no es esta la prioridad de la CPU, no la prioridad de IO? – CodesInChaos
@CodeInChaos sí, tienes razón, aunque imaginas que habría alguna conexión entre la prioridad de la CPU de un proceso y su prioridad de E/S? –
La forma correcta de hacer esto es llamar SetProcessPriorityClass con PROCESS_BACKGROUND_MODE_BEGIN para iniciar un segundo plano. Esto causa una prioridad de E/S muy baja (fondo) y una prioridad de CPU inactiva. Cuando termine, vuelva a llamar a SetProcessPriorityClass, proporcionando PROCESS_BACKGROUND_MODE_END. Lo mismo se puede hacer en el nivel de subproceso a través de SetThreadPriority y THREAD_BACKGROUND_MODE_BEGIN/END.
Si desea establecer directamente la prioridad de E/S, independientemente de la prioridad de la CPU, debe utilizar las API nativas NT. Lo documenté here, pero no incluí ejemplos de código, ya que todos sabemos que se copiaron al pie de la letra.
La API que desea es la API NT nativa NtSetInformationProcess. Al usar esta API puede cambiar la prioridad de E/S. Esta API acepta una variable de 'clase' que le dice qué tipo de información sobre el proceso desea cambiar, esa variable de clase debe establecerse en ProcessIoPriority. A continuación, puede configurar la prioridad de E/S del proceso de esta manera.
De forma similar, la prioridad de E/S se puede recuperar a través de NtQueryInformationProcess.
La mala noticia es que los niveles de prioridad son un poco limitados. Critical está reservado para las operaciones de paginación del sistema. Eso lo deja con Normal y Muy bajo (fondo). Bajo y Alto pueden o no implementarse en ediciones más nuevas de Windows. Parece haber un apoyo parcial, por lo menos.
Si no tiene experiencia con las API NT Native, lo primero que debe hacer es entenderlas. Una vez que lo hagas, verás que es tan simple como una sola llamada API.
El artículo que ha vinculado afirma que establecer la clase de prioridad de un proceso afecta su prioridad de E/S. No puedo encontrar ninguna documentación de Microsoft que indique este hecho. Además, mi prueba revela que simplemente no es el caso. Al establecer la clase de prioridad en 'Inactivo' en un proceso, parece que NO cambia su prioridad de E/S. – AlexPi
La forma en que Microsoft terminó haciendo esto es a través de SetProcessPriorityClass y/o SetThreadPriority, lo que indica un 'modo de fondo'. Esto hace que Windows ajuste tanto la prioridad de la CPU (al reposo) como la prioridad de E/S (a fondo) en un nivel de proceso, o nivel de subproceso, respectivamente. –
Asegúrese de alinear correctamente la estructura FILE_IO_PRIORITY_HINT_INFO
al llamar al SetFileInformationByHandle
.
De lo contrario, obtendrá un ERROR_NOACCESS
(error 998, 0x000003E6).
_declspec(align(8)) FILE_IO_PRIORITY_HINT_INFO priorityHint;
priorityHint.PriorityHint = IoPriorityHintLow;
BOOL ret = SetFileInformationByHandle(hFile, FileIoPriorityHintInfo, &priorityHint, sizeof(FILE_IO_PRIORITY_HINT_INFO));
DWORD err = GetLastError();
- 1. ¿Cómo cambio la prioridad de un proceso?
- 2. Cómo aumentar la prioridad de subprocesos en pthreads?
- 3. ¿Puedo establecer la prioridad de un solo subproceso por encima de 15 para un proceso de prioridad normal?
- 4. ¿Se puede aumentar :: regex_search en un wstring?
- 5. es bueno() usado para cambiar la prioridad del hilo o la prioridad del proceso?
- 6. cambiar la prioridad del proceso en android
- 7. ¿Se puede establecer la prioridad de BroadcastReceiver programáticamente?
- 8. ¿Cómo se puede aumentar el tiempo de espera en Linq2Entities?
- 9. ¿Cómo inicio un proceso con baja prioridad? C#
- 10. Cambiar prioridad del proceso actual en C
- 11. ¿Cómo puedo aumentar la prioridad de FinalizerThread para recopilar objetos en GC
- 12. No se puede aumentar memory_limit con ini_set()
- 13. ¿Para qué es la configuración de prioridad del proceso en "tiempo real"?
- 14. prioridad de inversión
- 15. Cambiar la prioridad del proceso en Python, multiplataforma
- 16. ¿Se puede representar una ventana de Direct3D para un proceso en otro proceso 'HWND?
- 17. ¿Cómo puede un servicio de Windows iniciar un proceso cuando se produce un evento de temporizador?
- 18. ¿Cómo se puede comunicar un proceso de 32 bits con un proceso de 64 bits en .NET?
- 19. ¿Cómo puedo aumentar el tamaño de la cadena que puede visualizar un visualizador de depurador externo?
- 20. Cómo limitar el uso de la CPU de un proceso
- 21. Cambiar la prioridad en una cola de prioridad personalizada
- 22. ¿Cómo puedo cambiar la prioridad de un mensaje en MSMQ?
- 23. ¿Cuál es la prioridad derecha de la expresión matemática
- 24. ¿Se puede alojar MongoDB en el proceso?
- 25. No se puede adjuntar al proceso
- 26. La configuración de bondad de proceso (prioridad) no tiene ningún efecto en Linux
- 27. jquery prioridad de evento
- 28. ¿cómo se puede aumentar el tamaño de las nubes de palabra del área graficada en R
- 29. ¿Cómo puedo aumentar la altura de un cuadro de texto sin Multiline = "true" o aumentar el tamaño de la fuente?
- 30. ASP.NET MVC FormsAuthentication El tiempo de espera de la cookie no se puede aumentar
(Sólo se puede reducir la prioridad de las solicitudes IO debajo de lo normal.) Ahora undestand qué ProcessExplorer solamente tiene prioridad normal y baja de E/S. Gracias por la buena respuesta ... – erdogany