Ejecutando TiDB en ARM64
TiDB se compone principalmente de tres partes: PD, TiKV y TiDB. Para PD y TiDB, usando Go para la compilación, solo necesitamos instalar la versión Go en la máquina ARM. Aquí estoy usando la versión GO 1.12.6. Linux-ARM64.
Es relativamente fácil compilar TiDB y PD con Go, pero hay un problema de compilación de TiDB a mitad de camino, que solo se puede resolver actualizando el proveedor.
Compilar TiKV es problemático porque estamos usando un sistema CentOS y el sistema puede usar yum para instalar dependencias relacionadas. Además de cmake3, la instalación de cmake también requiere el siguiente procesamiento:
Por supuesto, todavía habrá algunos errores al compilar RocksDB y Titan, pero la mayoría de ellos deben manejar errores relacionados con ARM64 al pasar parámetros de compilación. Las opciones no son particularmente difíciles.
En general, la compilación no lleva mucho tiempo. Aquí tienes un script para que puedas ver por ti mismo cómo compilar TiDB en ARM64. Para Grafana y Prometheus necesarios para ejecutar el clúster, se proporcionan versiones oficiales de ARM64; puede ir directamente a Google.
Después de compilar la versión ARM64, es natural probarla. Aquí hice una prueba sencilla usando go-ycsb. Aquí utilicé una máquina ARM64 16c32g y también abrí una máquina x86 con la misma configuración para comparar.
En cada máquina de prueba, inicie un PD y un TiKV, use la configuración predeterminada y luego go-ycsb use 100 para importar simultáneamente 10,000 datos, el número de operaciones es 10,000 y el tamaño del lote es 0 .
Los resultados son los siguientes:
Se puede ver que el rendimiento de la máquina ARM es mucho peor que el de x86 y debe optimizarse. Encontré este artículo en línea, utilicé el script anterior y descubrí que nada cambió. En este script, la optimización principal es vincular el procesamiento de interrupciones de la tarjeta de red a una determinada CPU y luego asignar RP a diferentes CPU. Para la máquina 16c32g, este script vincula el procesamiento de las interrupciones de la tarjeta de red a los núcleos 0 y 8 de la CPU, y luego asigna RPS a todas las CPU, pero descubrí a través de mpstat que los núcleos 0 y 8 están casi llenos:
Así que volví a escalar el RPS y lo extendí más allá de los núcleos 0 y 8:
Luego, OPS mejoró ligeramente, pero los núcleos de CPU 0 y 8 seguían siendo el cuello de botella. Este cuello de botella obviamente se debe al procesamiento de la red. La optimización intuitiva consiste en reducir el procesamiento de mensajes de la red, por lo que al configurar el tamaño del lote en 128, puede encontrar que el rendimiento en ARM mejora mucho. Por ejemplo, para la carga de trabajo C, el OPS se puede aumentar a 118270. Pero aun así, los núcleos de CPU 0 y 8 seguirán convirtiéndose en cuellos de botella.
En comparación con ARM, la distribución de CPU en x86 es obviamente mucho más uniforme:
Entonces, lo que debemos considerar más adelante es cómo hacer que ARM procese mejor los mensajes de red.
Lo anterior habla brevemente sobre cómo compilar y ejecutar TiDB en ARM y algunas estrategias de ajuste. Personalmente, creo que aunque ARM no puede seguir el ritmo de x86 de la misma configuración en términos de rendimiento, el bajo consumo de energía y el bajo costo son ventajas muy grandes, y hay muchas razones inexplicables. Personalmente creo que cada vez más empresas utilizarán ARM, por lo que esto también será una tendencia.