GNU/Linux, Open Source, Cloud Computing, DevOps y más...

Diferencias entre CPU física, CPU lógica, Core/Núcleo, Thread/Hilo y Socket

12 comentarios

Cuando tratamos de conocer la arquitectura y prestaciones a nivel de CPU de una máquina mediante comandos Linux como nproc o lscpu, muchas veces nos encontramos con que no somos capaces de interpretar sus resultados porque confundimos términos como CPU física, CPU lógica, CPU virtual, núcleos o cores, threads, sockets, etc. Si a esto le añadimos conceptos como HyperThreading (no confundir con multithreading), llega un momento en que ya no podemos estar seguros de cuántos cores tiene nuestra máquina, no entendemos por qué comandos como htop nos indican que tenemos 8 cpus cuando creíamos que habíamos comprado un único procesador quad-core, etc. En fin, un lío.

htop-command-outputPara aclararlo voy a explicar de forma gráfica mediante un par de diagramas todos estos conceptos. Espero que de solo un vistazo te quede todo esto mucho más claro y no vuelvas a tener nunca más este tipo de dudas.

Los orígenes: CPU’s de un sólo núcleo y aparición del hyperthreading

Antes de que aparecieran conceptos como multicore, cpu virtual o lógica, etc., allá por la época de los procesadores Pentium, la mayoría de los ordenadores montaban en su placa base un único chip de considerable tamaño que llamábamos simplemente CPU, microprocesador o sencillamente procesador. Sólo algunos ordenadores empresariales o servidores más grandes que requerían una mayor capacidad de procesamiento se podían permitir montar 2 ó más de estos chips en la misma placa: eran los sistemas multiprocesador. Estos chips se comunicaban con el resto de elementos de la placa base a través de un conector o socket. Y la matemática era de lo más sencilla: tantos conectores o sockets tenía una placa, tantas CPU podía tener como máximo una máquina. Si se quería mayor capacidad de procesamiento, tan sólo había que buscar una máquina con un mayor número de estos procesadores o esperar a que éstos evolucionaran para ofrecer mayores prestaciones.


Error: Your Requested widget " ai_widget-6" is not in the widget list.
  • [do_widget_area above-nav-left]
    • [do_widget_area above-nav-right]
      • [do_widget_area footer-1]
        • [do_widget id="wpp-4"]
      • [do_widget_area footer-2]
        • [do_widget id="recent-posts-4"]
      • [do_widget_area footer-3]
        • [do_widget id="recent-comments-3"]
      • [do_widget_area footer-4]
        • [do_widget id="archives-4"]
      • [do_widget_area logo-bar]
        • [do_widget id="oxywidgetwpml-3"]
      • [do_widget_area menu-bar]
        • [do_widget id="search-3"]
      • [do_widget_area sidebar]
        • [do_widget id="search-4"]
        • [do_widget id="ai_widget-2"]
        • [do_widget id="categories-5"]
        • [do_widget id="ai_widget-3"]
        • [do_widget id="ai_widget-4"]
        • [do_widget id="ai_widget-5"]
      • [do_widget_area sub-footer-1]
        • [do_widget id="text-4"]
      • [do_widget_area sub-footer-2]
        • [do_widget_area sub-footer-3]
          • [do_widget_area sub-footer-4]
            • [do_widget_area upper-footer-1]
              • [do_widget id="search-2"]
              • [do_widget id="recent-posts-2"]
              • [do_widget id="recent-comments-2"]
              • [do_widget id="archives-2"]
              • [do_widget id="categories-2"]
              • [do_widget id="meta-2"]
            • [do_widget_area upper-footer-2]
              • [do_widget_area upper-footer-3]
                • [do_widget_area upper-footer-4]
                  • [do_widget_area widgets_for_shortcodes]
                    • [do_widget id="search-5"]
                    • [do_widget id="ai_widget-6"]
                  • [do_widget_area wp_inactive_widgets]
                    • [do_widget id="wpp-2"]
                    • [do_widget id="text-1"]
                    • [do_widget id="recent-posts-3"]
                    • [do_widget id="categories-3"]
                    • [do_widget id="archives-3"]
                    • [do_widget id="icl_lang_sel_widget-3"]

                  Pero entonces Intel se percató de que la comunicación entre los distintos procesadores de un sistema multiprocesador era muy ineficiente, pues ésta se tenía que realizar a través del bus del sistema, que trabajaba a una velocidad normalmente bastante inferior a la de los propios procesadores, por lo que se formaban cuellos de botella que impedían sacar todo el partido posible a la capacidad de cómputo que ofrecía cada CPU.

                  single-core-hyperthreading-cpu-diagramPara tratar de mejorar esta situación se inventó la tecnología HyperThreading, que duplicó dentro del chip del procesador varios de sus elementos internos como registros o memorias caché de primer nivel de modo que se pudiera compartir información entre dos hilos de ejecución distintos sin tener que pasar por el bus del sistema con los correspondientes problemas de cuellos de botella y pérdidas de velocidad. Esto también permitía que si un proceso debía quedar a la espera de una interrupción, por ejemplo, otro proceso pudiera seguir haciendo uso de la CPU sin que ésta se quedara parada.

                  De este modo se conseguía acelerar diversos procesos y comenzaron a ofrecerse procesadores con un mayor rendimiento global que los tradicionales, y al sistema operativo se le «engañaba» porque se le ofrecían 2 cpus virtuales o lógicas (LCPU) en lugar de una sola, dado que se le permitía ejecutar 2 procesos «al mismo tiempo». Pero es importante tener claro que en realidad no se alcanzaba un rendimiento equivalente al doble respecto a un procesador tradicional, ni en realidad se podían ofrecer capacidades completas de procesamiento en paralelo.


                  Error: Your Requested widget " ai_widget-6" is not in the widget list.
                  • [do_widget_area above-nav-left]
                    • [do_widget_area above-nav-right]
                      • [do_widget_area footer-1]
                        • [do_widget id="wpp-4"]
                      • [do_widget_area footer-2]
                        • [do_widget id="recent-posts-4"]
                      • [do_widget_area footer-3]
                        • [do_widget id="recent-comments-3"]
                      • [do_widget_area footer-4]
                        • [do_widget id="archives-4"]
                      • [do_widget_area logo-bar]
                        • [do_widget id="oxywidgetwpml-3"]
                      • [do_widget_area menu-bar]
                        • [do_widget id="search-3"]
                      • [do_widget_area sidebar]
                        • [do_widget id="search-4"]
                        • [do_widget id="ai_widget-2"]
                        • [do_widget id="categories-5"]
                        • [do_widget id="ai_widget-3"]
                        • [do_widget id="ai_widget-4"]
                        • [do_widget id="ai_widget-5"]
                      • [do_widget_area sub-footer-1]
                        • [do_widget id="text-4"]
                      • [do_widget_area sub-footer-2]
                        • [do_widget_area sub-footer-3]
                          • [do_widget_area sub-footer-4]
                            • [do_widget_area upper-footer-1]
                              • [do_widget id="search-2"]
                              • [do_widget id="recent-posts-2"]
                              • [do_widget id="recent-comments-2"]
                              • [do_widget id="archives-2"]
                              • [do_widget id="categories-2"]
                              • [do_widget id="meta-2"]
                            • [do_widget_area upper-footer-2]
                              • [do_widget_area upper-footer-3]
                                • [do_widget_area upper-footer-4]
                                  • [do_widget_area widgets_for_shortcodes]
                                    • [do_widget id="search-5"]
                                    • [do_widget id="ai_widget-6"]
                                  • [do_widget_area wp_inactive_widgets]
                                    • [do_widget id="wpp-2"]
                                    • [do_widget id="text-1"]
                                    • [do_widget id="recent-posts-3"]
                                    • [do_widget id="categories-3"]
                                    • [do_widget id="archives-3"]
                                    • [do_widget id="icl_lang_sel_widget-3"]

                                  Así, desde el punto de vista de Linux o de cualquier otro sistema operativo, una máquina con 1 único procesador de 1 único core o núcleo, pero con la tecnología HyperThreading, aparecería ante nuestros ojos como que tiene 2 CPU’s. Pero se trataría de 2 cpus lógicas correspondientes a 1 única CPU física.

                                  Una vuelta de tuerca más: aparición de las arquitecturas multicore

                                  Pero tal y como decía en el apartado anterior, aunque las CPU’s con hyperthreading ofrecen mayor capacidad de procesamiento, no pueden llegar a ofrecer las características de 2 procesadores completos, por lo que se decidió dar una vuelta de tuerca más y se consiguió miniaturizar todos los componentes de un procesador y encapsularlos junto a los de otros en una única pastilla o chip. A cada uno de esos procesadores encapsulados se les llamó cores o núcleos, y con ello se consiguió que la comunicación entre ellos se realizara de una forma mucho más rápida a través de un bus interno integrado en la propia pastilla de silicio sin tener que recurrir por tanto al bus del sistema, mucho más lento.

                                  quad-core-hyperthreading-cpu-diagramAl contrario que en el caso de la tecnología HyperThreading, en este caso sí tendríamos a todos los efectos varias cpus completamente independientes, una por cada core o núcleo. De hecho de cara al rendimiento es mejor tener un único procesador multicore que el número equivalente de CPU’s de un solo core en una misma placa. Por supuesto seguiría siendo mejor tener 2 procesadores dual-core que uno solo, pero aún mejor sería tener un único quad-core.

                                  A nivel de sistema operativo, al usuario de un sistema con 1 procesador quad-core se le indicaría que tiene 4 CPU’s, pero serían 4 cpus lógicas (LCPU), no físicas. Si además ese procesador incorporara la tecnología HyperThreading, los comandos como htop o nproc indicarían que hay 8 cpus en el sistema, pero ofrecería un menor rendimiento que si se trataran de 8 cpus provenientes de un único procesador octa-core sin HyperThreading.

                                  1 LCPU = 1 thread

                                  Por último comentar que a veces se indica que un procesador ofrece por ejemplo un total de 4 threads, o que tiene 2 threads por núcleo. Esto se refiere simplemente a que permiten un determinado número de hilos de ejecución o trabajos de procesamiento simultáneamente, y esto sería el equivalente a la capacidad de procesamiento que ofrece una LCPU. Si un procesador permite 2 threads por núcleo quiere decir que tiene HyperThreading, y si no lo normal es que el número de cores coincida con el de threads.

                                  CPU lógica vs CPU virtual

                                  El término CPU virtual es comparable al de CPU lógica, pero introduce un cierto matiz, ya que se encuadra más en términos de virtualización informática. Se refiere a aquellas cpus mapeadas a una máquina virtual desde el hardware subyacente del host, que pueden ser cpus físicas o lógicas, con HyperThreading o no. Pero normalmente 1 cpu lógica del sistema host se mapea a 1 cpu virtual dentro de la máquina virtual, por lo que se podría decir que son términos casi equivalentes.

                                  Lectura recomendada:
                                    Cómo saber cuántos procesadores y núcleos tiene una máquina Linux

                                   

                                  Sobre el autor

                                  Daniel López Azaña
                                  Arquitecto de soluciones Cloud AWS & Linux Sysadmin Freelance

                                  Emprendedor, generador de ideas y mente inquieta. Apasionado de las nuevas tecnologías, especialmente de los sistemas Linux y del software libre. Me gusta escribir además sobre actualidad tecnológica, Cloud Computing, AWSi, DevOps, DevSecOps, seguridad, desarrollo web y programación, SEO, ciencia, innovación, emprendimiento, etc.

                                  DanielDiferencias entre CPU física, CPU lógica, Core/Núcleo, Thread/Hilo y Socket

                                  Artículos relacionados

                                  12 comentarios

                                  Unirte a la conversación
                                  • Julián - 28/06/2018 responder

                                    Muy bueno y completo! Gracias

                                  • Cristian - 28/09/2018 responder

                                    En pocas y llanas palabras, muy bueno, seguiré consultando temas de tu blog.

                                  • Miguel - 08/11/2018 responder

                                    Me gustó mucho la explicación, gracias amigo

                                  • sergio - 24/03/2019 responder

                                    Perfecta la síntesis y explicación.
                                    Muy agradecido!!

                                  • Roberto Metcalfe - 29/04/2019 responder

                                    Súper gráfica la explicación. Gracias.

                                  • Edgar - 07/05/2019 responder

                                    Gracias por la explicación, muy clara!

                                  • Juan Diego Chica Salazar - 17/05/2019 responder

                                    excelente, sencilla explicación

                                  • Erick Antonio - 30/01/2020 responder

                                    Gracias por la explicacion, bastante sencilla

                                  • Andres Ivan Rodriguez Galan - 01/04/2020 responder

                                    Espectacular la explicación, el contexto del origen es completamente necesario para entender el cuento.

                                    Muchas Gracias, tremendamente util.

                                    Solo me queda la duda de si dependiendo de los sistemas operativos esto tiene alguna implicación, es decir es distinto el manejo en un solaris a un Linux en cuanto a la cantidad de CPU?

                                    Daniel - 20/04/2020 responder

                                    Gracias Andrés. En principio todos los sistemas operativos deberían tener la misma constancia del hardware subyacente que manejan, es decir, que todos reconocerán el mismo número de CPU’s, núcleos, sockets, etc. si ofrecen soporte para ello. Es decir, por ejemplo un sistema operativo X podría no tener soporte para Hyper Threading y no aprovechar esa característica. Y aunque sí ofrezcan soporte, cada uno gestionará esos recursos de forma particular y no tiene por qué coincidir con cómo lo hacen Linux u otros sistemas operativos.

                                  • Mila - 29/10/2020 responder

                                    Muchas gracias, es un articulo muy didactico y claro.
                                    ¿tienes alguna recomendación de lectura o quizás un articulo tuyo para entender también el concepto de socket en entornos virtualizados cuando configuran VM con varias vCPUs? por ejemplo en VMware.

                                    Daniel - 27/02/2021 responder

                                    Lo siento, no dispongo de ese artículo, pero tomo nota, ¡gracias!

                                  Deja una respuesta

                                  Tu dirección de correo electrónico no será publicada.