¿Cuáles son las limitaciones del hilo cuando se trabaja en Linux en comparación con los procesos para aplicaciones de red / IO?

He escuchado que bajo linux en el servidor multinúcleo sería imposible alcanzar el máximo rendimiento cuando tienes solo 1 proceso pero múltiples hilos porque Linux tiene algunas limitaciones en el IO, por lo que 1 proceso con 8 hilos en el servidor de 8 núcleos podría ser más lento que 8 procesos.

¿Algún comentario? ¿Hay alguna otra limitación que pueda ralentizar las aplicaciones? Las aplicaciones son una aplicación C ++ de red que atiende a cientos de clientes con algunos discos IO.

Actualización: me preocupa que haya más problemas relacionados con IO que no sean el locking que implemento yo mismo … ¿No hay problemas al hacer simultánea red / disco IO en varios subprocesos?

Inconvenientes de hilos

Trapos:

  • Serializar en operaciones de memoria. Ese es el núcleo y, a su vez, la MMU debe dar servicio a operaciones como mmap() que realizan asignaciones de página.
  • Comparta la misma tabla de descriptores de archivos. El locking implica realizar cambios y realizar búsquedas en esta tabla, que almacena cosas como compensaciones de archivos y otros indicadores. Cada llamada al sistema realizada que utiliza esta tabla, como open() , accept() , fcntl() debe bloquearla para traducir fd al manejador interno de archivos y cuando se realizan cambios.
  • Comparte algunos atributos de progtwigción. Los procesos se evalúan constantemente para determinar la carga que están cargando en el sistema y se progtwign en consecuencia. Muchos subprocesos implican una mayor carga de CPU, que normalmente no le gusta al planificador, y boostá el tiempo de respuesta en los eventos para ese proceso (como la lectura de datos entrantes en un socket).
  • Puede compartir algo de memoria grabable. Cualquier memoria que se escribe en varios subprocesos (especialmente lenta si requiere un locking sofisticado) generará todo tipo de conflictos de contención y de convoy. Por ejemplo, las operaciones de montón como malloc() y free() operan en una estructura de datos global (que en cierto modo se puede solucionar). También hay otras estructuras globales.
  • Compartir credenciales, esto podría ser un problema para los procesos de tipo de servicio.
  • Compartir el manejo de la señal, estos interrumpirán todo el proceso mientras se manejan.

Procesos o hilos?

  • Si desea que la depuración sea más fácil, use los hilos.
  • Si está en Windows, use los hilos. (Los procesos son extremadamente pesados ​​en Windows).
  • Si la estabilidad es una gran preocupación, intente usar procesos. (Un SIGSEGV/PIPE es todo lo que se necesita …).
  • Si los hilos no están disponibles, use procesos. (No es tan común ahora, pero sucedió).
  • Si sus subprocesos comparten recursos que no se pueden usar desde procesos múltiples, use subprocesos. (O proporcione un mecanismo de IPC para permitir la comunicación con el hilo “propietario” del recurso).
  • Si usa recursos que solo están disponibles uno por proceso (y uno por contexto), obviamente use procesos.
  • Si sus contextos de procesamiento no comparten absolutamente nada (como un servidor de socket que genera y olvida conexiones a medida que las accept() ), y la CPU es un cuello de botella, utilice procesos y tiempos de ejecución de subprocesos únicos (que carecen de todo tipo de locking intenso) como en el montón y otros lugares).
  • Una de las mayores diferencias entre hilos y procesos es la siguiente: los hilos utilizan construcciones de software para proteger las estructuras de datos, los procesos usan hardware (que es significativamente más rápido).

Campo de golf

  • pthreads (7)
  • Acerca de procesos e hilos (MSDN)
  • Hilos vs. Procesos

realmente no debería hacer ninguna diferencia, pero probablemente se trata de diseño.

Una aplicación de proceso múltiple puede tener que hacer menos locking pero puede usar más memoria. Compartir datos entre procesos puede ser más difícil.

Por otro lado, el proceso múltiple puede ser más robusto. Puede llamar a exit () y salir de manera segura del elemento principal sin afectar a los demás.

Depende de qué tan dependientes sean los clientes. Usualmente recomiendo la solución más simple.