通过系统工具限制MariaDB的CPU、内存及文件描述符使用,避免单个进程耗尽系统资源。
/etc/security/limits.conf,添加mysql soft nofile 65535和mysql hard nofile 65535(nofile为最大文件描述符数),重启系统或重新登录使设置生效,解决高并发下的“Too many open files”问题。/etc/systemd/system/mariadb.service.d/override.conf文件,添加[Service] LimitNOFILE=65535,然后执行sudo systemctl daemon-reload && sudo systemctl restart mariadb,限制单个进程的文件描述符数。cgroup-tools(sudo apt-get install cgroup-tools),创建内存限制组sudo cgcreate -g memory:/mariadb,设置内存上限echo "1G" | sudo tee /sys/fs/cgroup/memory/mariadb/memory.limit_in_bytes,将MariaDB进程加入该组(ps aux | grep mysqld获取PID,sudo cgclassify -g memory:/mariadb <PID>)。--memory="1g"(内存限制)和--cpus="1.0"(CPU核心数限制),例如:docker run --name some-mariadb -e MYSQL_ROOT_PASSWORD=my-secret-pw -d --memory="1g" --cpus="1.0" mariadb:tag。合理配置MariaDB的关键参数,减少不必要的内存占用和并发负载。
innodb_buffer_pool_size是InnoDB引擎的核心参数,用于缓存数据和索引,建议设置为系统内存的50%-80%(如8GB内存可设为4-6GB),显著提升数据读取效率。key_buffer_size(默认16M即可,若频繁使用MyISAM索引可适当增加,但不宜超过256M)。max_connections默认151,可根据应用需求调整(如100-200),避免过多连接导致内存耗尽;同时设置thread_cache_size(如16-32),提高连接复用率,减少线程创建开销。tmp_table_size和max_heap_table_size(默认16M)控制内存临时表的最大大小,超过则转为磁盘临时表。若应用频繁使用ORDER BY、GROUP BY,可适当增加至128M,但需避免过大导致内存溢出。query_cache_type=0(MariaDB 10.2+已弃用查询缓存,关闭可提升性能)、performance_schema=off(关闭性能模式,减少内存占用,适用于低资源环境)。低效查询是导致资源占用高的主要原因之一,通过优化查询语句和索引降低负载。
EXPLAIN SELECT ...查看查询计划,识别全表扫描、临时表、文件排序等问题,针对性优化。WHERE、JOIN、ORDER BY子句中的列),避免全表扫描;复合索引需遵循“最左前缀”原则(如(user_id, create_time)索引可用于WHERE user_id=1 ORDER BY create_time)。SELECT id, name FROM users),减少数据传输量和内存占用。JOIN替代子查询(如SELECT a.* FROM table_a a JOIN table_b b ON a.id=b.a_id),减少临时表生成;确保JOIN字段有索引。LIMIT offset, size(如LIMIT 1000, 20),避免一次性获取大量数据。硬件资源不足是资源占用的根本原因之一,升级硬件可直接改善MariaDB性能。
innodb_buffer_pool_size),更多内存可减少磁盘I/O,提升查询速度。定期维护可清理无用数据、优化表结构,减少资源浪费。
OPTIMIZE TABLE命令整理表碎片(如OPTIMIZE TABLE large_table),回收未使用的空间,提升查询效率。通过监控工具实时了解MariaDB的资源使用情况,及时发现和解决问题。
slow_query_log=ON和long_query_time=1(记录执行时间超过1秒的查询),定期分析慢查询日志,优化低效查询。