El mejor Linux para MySQL

By | 15/02/2016

Introducción

No es ningún secreto que MySQL tiene un rendimiento superior en Linux que en otros sistemas operativos (ver este artículo al respecto), pero considerando que existen decenas de distribuciones de Linux es importante evaluar de forma empírica el desempeño del motor en las distintas distribuciones para ver si existe una diferencia significativa entre las mismas.

En este artículo se analiza la performance de MySQL 5.7.11 en las últimas versiones de algunas de las distribuciones más populares de Linux. El artículo se enfoca principalmente en la performance de la lectura sobre la base de datos ya que en mi experiencia, representa la carga más significativa sobre una base de datos.

Entorno de pruebas

Las pruebas fueron realizadas en un equipo dedicado, con un procesador AMD Phenom 9550 (4 x 2,2Ghz), 6GB de memoria RAM, un único disco S-ATA II de 650GB y conexión a LAN de 1Gbps. Se trabajó con dos bases de datos reales, con las siguientes características:

  • Base de datos A: ocupando 400MB en disco, posee una tabla principal de 1.000.000 registros y una única tabla lookup de 60.000 registros. La tabla principal tiene 36 campos con un peso ASCII aproximado de 350 bytes por registro. Todas las tablas son InnoDB.
  • Base de datos B: ocupando 272MB en disco e incluyendo una tabla principal de 600.000 registros con varias tablas lookup de 20 registros de promedio. La tabla principal tiene varios campos de texto por lo que algunos registros llegan a ocupar varios kilobytes. Todas las tablas son InnoDB.

Los versiones de Linux analizadas en las pruebas son:

  • Ubuntu Server 14.04.3 LTS
  • Ubuntu Server 15.10
  • Debian 8.3
  • Fedora Server 23
  • CentOS 7.2
  • SUSE Linux Enterprise Server 12 SP1

En todos los casos se partió de una instalación nueva del sistema operativo (64 bits), actualizado a febrero de 2016, y realizando la menor cantidad de configuraciones posibles sobre el mismo (en otras palabras, se respetaron todas las configuraciones por default). Siempre se instaló la misma versión de MySQL (5.7.11) a partir de los repositorios oficiales de Oracle los cuales se encuentran disponibles para los diferentes sistemas de gestión de paquetes (APT, Yum o SUSE).

Consultas diseñadas

Se diseñaron 10 consultas con el objetivo de poder representar las cargas de trabajo más comunes sobre una base de datos, siendo 8 consultas aplicadas sobre la base de datos A y 2 sobre la base de datos B. Se ejecutó cada consulta en 3 oportunidades consecutivas tomando como válido el tiempo promedio de ejecución de las mismas.

Resultados de las pruebas

Consultas sobre la base de datos A

Consulta 1Consulta 1

Realiza un count sobre un join entre la tabla principal y la tabla lookup. SUSE 12 SP1 tiene el mejor resultado (5,448 segundos), seguido de cerca por Fedora 23 (5,594 segundos; 2,6% más lento) y Debian 8.3 (5,693 segundos; 4,5% más lento).

Con un promedio de ejecución de 5,726 segundos, el desvío estándar es de 0,214 segundos. El peor tiempo de ejecución pertenece a Ubuntu 14.04 LTS que con 6,078 segundos demora un 11,6% más que SUSE 12 SP1.

Consulta 2Consulta 2

Realiza un count sobre un join entre la tabla principal y la tabla lookup, aplicando un filtro (=) sobre la tabla lookup. El mejor tiempo es de Fedora 23 (1,130 segundos) pero seguido muy de cerca por Debian 8.3 (1,138 segundos; apenas 0,6% más lento) y Ubuntu 15.10 (1,151 segundos; 1,8% más lento).

El promedio de ejecución es de 1,326 segundos con un desvío estándar de 0,366 segundos. Tal como se puede apreciar en el gráfico, Ubuntu 14.04 LTS tiene una marcada baja performance en esta consulta. Su tiempo de 2,062 segundos es un 82% mayor que el de Fedora. Sin contar el resultado de Ubuntu 14.04 LTS, el desvío estándar es de apenas 0,069 segundos, lo que indica un performance muy pareja en esta consulta para las demás distribuciones.

Consulta 3Consulta 3

Realiza un count sobre un join entre la tabla principal y la tabla lookup, aplicando un filtro (like con un comodín -%-) sobre la tabla lookup. El mejor tiempo es el de Fedora 23, que con 5,766 segundos es un 1,3% mejor que Debian 8.3 (5,839 segundos) y un 1,7% mejor que SUSE 12 SP1 (5,865).

El promedio de ejecución es de 5,995 segundos con un desvío estándar de 0,226 segundos. El peor tiempo es de CentOS 7.2: 6,317 segundos, un 9,6% más lento que Fedora 23.

Consulta 4Consulta 4

Realiza un join entre la tabla principal y la tabla lookup, aplicando un filtro (like con un comodín -%-) sobre la tabla lookup. Además incluye el traspaso de los datos (23000 registros) desde el servidor a un equipo cliente, teniendo esta tarea más peso en el tiempo de ejecución que la propia consulta. El mejor tiempo en esta consulta es el de Fedora 23 que con 8,583 segundos es un 3% más rápida que SUSE 12 SP1 (8,839 segundos) y un 7,9% más rápida que Debian 8.3 (9,265 segundos).

Nuevamente CentOS 7.2 tiene el peor tiempo de ejecución (9,625 segundos), un 12,1% mayor que el de Fedora 23. El promedio en este caso es de 9,209 segundos con un desvío estándar de 0,411 segundos.

Consulta 5Consulta 5

Realiza un join entre la tabla principal y la tabla lookup. Incluye el traspaso de los datos (más de 900000 registros) desde el servidor a un equipo cliente. Al igual que en la consulta anterior, el traspaso de datos tiene más peso que la ejecución de la consulta. El mejor tiempo es de Fedora 23 (24,182 segundos) pero seguido muy de cerca por SUSE 12 SP1 (24,187 segundos) y Ubuntu 14.04 LTS (24,197 segundos), ambos con una diferencia menor al 0,1% con respecto a Fedora 23.

El peor tiempo en este caso corresponde a Debian 8.3 que con 37,979 segundos es un 57% más lento que Fedora. La media para esta consulta es de 28,048 segundos con un desvío estándar de 6,112 segundos.

Consulta 6Consulta 6

Es un group by entre un join de la tabla principal y la tabla lookup. Nuevamente el mejor tiempo corresponde a Fedora 23 (6,115 segundos) seguido por SUSE 12 SP1 (6,323 segundos – 3,4% más lento) y Debian 8.3 (6,339 segundos – 3,7% más lento).

El promedio de ejecución es de 6,541 segundos con un desvío estándar de 0,353 segundos. El peor tiempo es de Ubuntu 14.04 LTS que con 7,083 segundos es un 15% más lento que Fedora 23.

Consulta 7Consulta 7

Realiza un count sobre un join entre la tabla principal y la tabla lookup, aplicando un filtro (like con dos comodines -%-) sobre la tabla lookup. El mejor tiempo en esta consulta es de Fedora 23, que con 5,437 segundos es un 1,3% más rápido que Debian 8.3 (5,510 segundos) y un 2,9% más rápido que SUSE 12 SP1 (5,593 segundos).

El promedio de ejecución es de 5,733 segundos con un desvío de 0,342 segundos. El peor tiempo, nuevamente, corresponde a Ubuntu 14.04 LTS que con sus 6,354 segundos se comporta un 16,9% más lento que Fedora 23.

Consulta 8Consulta 8

Es un count sobre la tabla principal sobre si misma. El mejor tiempo de ejecución corresponde a Fedora 23. Demorando 8,292 segundos tiene un desempeño 4% superior a SUSE 12 SP1 y Debian 8.3 (8,620 y 8,625 segundos respectivamente).

El tiempo promedio de ejecución es 8,940 segundos con un desvío estándar de 0,624 segundos. El peor tiempo es el de Ubuntu 14.04 LTS que con 9,958 segundos es un 20% más lenot que Fedora 23.

Consultas sobre la base de datos B

Consulta 9Consulta 9

Realiza un count distinct sobre un join entre la tabla principal y dos tablas de lookup. Se apican dos filtros (like con dos comodines -%-) sobre dos campos diferentes de la tabla principal. El mejor tiempo de ejecución es de SUSE 12 SP1. Sus 2,599 segundos son un 2,6% mejor a los de Ubuntu 15.10 (2,667 segundos) y un 4,2% mejor que los de Fedora 23 (2,709 segundos).

El promedio de ejecución es de 2,834 segundos con un desvío estándar de 0,201 segundos. El peor tiempo de ejecución es para Ubuntu 14.04 LTS, 18% más lento (3,078 segundos) que SUSE 12 SP1.

Consulta 10Consulta 10

Realiza un group by sobre la tabla principal. El mejor tiempo de ejecución corresponde a Fedora 23, seguido por SUSE 12 SP1 (1,302 segundos – 4,2% más lento) y Debian 8.3 (1,328 segundos – 6,3% más lento).

El tiempo promedio de ejecución es de 1,348 segundos con un desvío de 0,073 segundos. El peor tiempo de ejecución corresponde a CentOS 7.2 con 1,443 segundos (15% peor que Fedora 23).

Conclusiones de las pruebas

  • De los seis sistemas operativos evaluados, Fedora 23 tuvo la mejor performance en 8 de las 10 consultas. En las otras 2 consultas apareció en el podio de las tres mejores.
  • SUSE Linux Enterprise Server 12 SP1 tuvo la mejor performance en las restantes 2 consultas y apareció en el podio en siete de las restantes ocho.
  • Debian 8.3 apareció en el podio en 8 oportunidades, pero tuvo el peor rendimiento en una oportunidad.
  • Salvo en las consultas 4 y 5, que implicaban el traspaso de datos, Ubuntu 15.10 tuvo siempre un mejor rendimiento que Ubuntu 14.04 LTS (16% superior en promedio).
  • Ubuntu 14.04 LTS tuvo el peor desempeño en 6 de las 10 consultas.
  • CentOS 7.2 tuvo el peor desempeño en 3 de las 10 consultas.

Otros aspectos a considerar

Además de la performance en la lectura, hay otros aspectos que son importantes a la hora de determinar la mejor distribución de Linux para MySQL. En esta sección analizamos algunos de ellos:

  • Instalación y actualización: tres de las distribuciones elegidas (Debian y ambas Ubuntu) utilizan paquetes DEB mientras que las tres restantes (Fedora, CentOS y SUSE) utilizan paquetes RPM. Para las pruebas se utilizaron apt, dnf, yum y zypper con resultados satisfactorios en todos los casos. La preferencia por uno u otro sistema será principalmente una cuestión de gustos.
  • Soporte y costo de la distribución: todas las distribuciones evaluadas pueden ser utilizadas sin necesidad de abonar ningún costo con la excepción de SUSE que requiere una licencia anual de U$S 799 (suscripción Standard) y que incluye soporte técnico ilimitado y acceso a actualizaciones. Otras empresas también proveen soporte técnico pago pero permiten el uso de su distribución sin ningún pago o registro adicional, incluyendo desde luego el acceso a actualizaciones.
    En lo que respecta a soporte, las comunidades más grandes entre las distribuciones evaluadas son las de Debian, Ubuntu y Fedora (según DistroWatch), pero a los fines prácticos no debería haber ningún inconveniente en encontrar información para cualquiera de las distribuciones analizadas.
  • Sistema de archivos: como ya se analizó en un artículo anterior, el sistema de archivos tiene un impacto en el rendimiento de la base de datos. En las pruebas realizadas se respeto siempre el sistema de archivos elegido por defecto por la distribución. Es importante aclarar que en la actualidad la mayoría de las distribuciones provee soporte para los mismos sistemas de archivos.
  • Conexiones concurrentes: en este artículo se utilizó un único cliente para acceder a la base de datos y en ningún momento se realizaron operaciones concurrentes sobre la misma. Sería interesante analizar el rendimiento de las diferentes distribuciones en cargas de trabajo real donde normalmente hay consultas concurrentes trabajando sobre el motor.
  • Performance en la escritura: como ya se mencionó en la introducción, en este artículo únicamente se analiza la performance de la lectura ya que representa la carga de trabajo más común. En varios escenarios puede darse que haya más escrituras que lecturas, situación en la que deberían tomarse otras consideraciones.

Resumen

En base a las pruebas realizadas y a los criterios evaluados en este artículo podemos afirmar que la mejor distribución para MySQL 5.7.11 es Fedora 23, seguida de cerca por Debian 8.3.

Más información

  • https://www.quora.com/What-Linux-distribution-is-the-best-suited-to-act-with-a-server-which-hosts-a-MySQL-database
  • https://www.percona.com/blog/2011/12/08/which-linux-distribution-for-mysql-server/
  • http://serverfault.com/questions/180655/best-linux-distro-for-mysql-dedicated-server