Para optimizar la gestión de memoria en entornos de bases de datos de alto rendimiento, compilar MariaDB desde el código fuente integrando jemalloc es una práctica altamente recomendada. A continuación, se detalla el proceso completo en un sistema CentOS 7 de 64 bits, utilizando MariaDB 10.0.
Compilación e instalación de jemalloc
Primero, descargue y compile la biblioteca de asignación de memoria jemalloc. En este ejemplo, la instalaremos en un directorio personalizado.
cd /usr/src
curl -LO https://github.com/jemalloc/jemalloc/releases/download/4.5.0/jemalloc-4.5.0.tar.bz2
tar -xjf jemalloc-4.5.0.tar.bz2
cd jemalloc-4.5.0
./configure --prefix=/opt/jemalloc
make -j$(nproc) && make install
# Configurar las bibliotecas dinámicas
echo "/opt/jemalloc/lib" > /etc/ld.so.conf.d/jemalloc.conf
ldconfig
ln -sf /opt/jemalloc/lib/libjemalloc.so.2 /usr/lib64/libjemalloc.so
Preparación del entorno para MariaDB
Instale las dependencias necesarias y configure los directorios y usuarios del sistema.
yum install -y cmake gcc gcc-c++ openssl-devel zlib-devel ncurses-devel bison
# Crear directorios personalizados
mkdir -p /srv/mariadb/{data,logs,tmp,run}
# Crear usuario y grupo del sistema
groupadd -r -g 3307 mysql
useradd -r -u 3307 -g mysql -s /sbin/nologin -d /srv/mariadb mysql
chown -R mysql:mysql /srv/mariadb
Configuración y compilación de MariaDB
Decsargue el código fuente de MariaDB 10.0 y ejecute CMake con parámetros optimizados. Se ha actualizado el conjunto de caracteres predeterminado a utf8mb4 para un mejor soporte de Unicode.
cd /usr/src
tar -xzf mariadb-10.0.38.tar.gz
cd mariadb-10.0.38
cmake . \
-DCMAKE_INSTALL_PREFIX=/opt/mariadb \
-DMYSQL_DATADIR=/srv/mariadb/data \
-DTMPDIR=/srv/mariadb/tmp \
-DMYSQL_UNIX_ADDR=/srv/mariadb/run/mysql.sock \
-DSYSCONFDIR=/etc/mariadb \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_unicode_ci \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DMYSQL_TCP_PORT=3306 \
-DCMAKE_EXE_LINKER_FLAGS="-ljemalloc" \
-DWITH_SAFEMALLOC=OFF \
-DWITH_SSL=system \
-DWITH_ZLIB=system
make -j$(nproc) && make install
Configuración del servidor
Cree el archivo de configuración principal en /etc/mariadb/my.cnf con parámetros ajustados para un rendimiento óptimo.
[client]
port = 3306
socket = /srv/mariadb/run/mysql.sock
default-character-set = utf8mb4
[mysqld]
port = 3306
socket = /srv/mariadb/run/mysql.sock
datadir = /srv/mariadb/data
tmpdir = /srv/mariadb/tmp
# Configuración de red y conexiones
back_log = 100
max_connections = 500
max_connect_errors = 100
max_allowed_packet = 32M
# Buffers y cachés
table_open_cache = 4096
thread_cache_size = 16
query_cache_size = 0
query_cache_type = 0
# Configuración de InnoDB
default_storage_engine = InnoDB
innodb_buffer_pool_size = 2G
innodb_log_file_size = 512M
innodb_log_buffer_size = 16M
innodb_flush_log_at_trx_commit = 1
innodb_file_per_table = 1
innodb_io_capacity = 2000
innodb_read_io_threads = 8
innodb_write_io_threads = 8
# Registros
log_error = /srv/mariadb/logs/error.log
slow_query_log = 1
slow_query_log_file = /srv/mariadb/logs/slow.log
long_query_time = 2
[mysqld_safe]
open_files_limit = 65535
pid_file = /srv/mariadb/run/mysql.pid
Inicialización y configuración del servicio
En CentOS 7, es preferible utilizar systemd para gestionar los servicios. Inicialice la base de datos y cree el archivo de unidad.
# Inicializar el directorio de datos
cd /opt/mariadb
./scripts/mysql_install_db --user=mysql --datadir=/srv/mariadb/data --defaults-file=/etc/mariadb/my.cnf
# Crear archivo de servicio systemd
cat << 'EOF' > /etc/systemd/system/mariadb-custom.service
[Unit]
Description=MariaDB Custom Database Server
After=network.target
[Service]
Type=forking
User=mysql
Group=mysql
ExecStart=/opt/mariadb/bin/mysqld_safe --defaults-file=/etc/mariadb/my.cnf &
ExecStop=/opt/mariadb/bin/mysqladmin -u root shutdown
LimitNOFILE=65535
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
# Habilitar e iniciar el servicio
systemctl daemon-reload
systemctl enable mariadb-custom
systemctl start mariadb-custom
Configuración de variables de entorno
Añada los binarios de MariaDB al PATH del sistema para facilitar su administración.
echo 'export PATH=/opt/mariadb/bin:$PATH' > /etc/profile.d/mariadb.sh
source /etc/profile.d/mariadb.sh
Verificación de la integración de jemalloc
Para confirmar que el servidor está utilizando correctamente el asignador de memoria alternativo, inspeccione los procesos en ejecución.
# Obtener el PID del proceso mysqld y verificar las bibliotecas cargadas
MARIADB_PID=$(pgrep -x mysqld)
lsof -p $MARIADB_PID | grep jemalloc
La salida debería mostrar que libjemalloc.so está mapeada en la memoria del proceso, confirmando que la optimización está activa.