我有一个基于四核处理器的16 GiG RAM和4 TB硬盘用于DB和4 TB用于OS。 分配的缓冲池为6 GB。尝试了70%的内存,但结果是一样的。 记忆很快就会被填满。当我重新启动服务时,它被释放,但是说不到20分钟,10-15%就会被填满。
我的my.conf配置:
[client]
socket=/db/mysql/mysql.sock
[mysqld]
datadir=/db/mysql
socket=/db/mysql/mysql.sock
innodb_max_dirty_pages_pct = 0
innodb_file_per_table = 1
innodb_buffer_pool_size = 6G
innodb_buffer_pool_instances = 6
thread_cache_size = 4
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
query_cache_type = 0
innodb_fast_shutdown=0
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
重要参考资料:
显示变量 - pastebin.com/wzAhva55 显示全局状态 - pastebin.com/8G1N3g78
答案 0 :(得分:3)
<强>观察:强>
Version: **5.5.50-MariaDB**
**16 GB** of RAM
Uptime = **3d 05:16:26**
You are **not** running on Windows.
Running **64-bit** version
You appear to be running entirely (or mostly) **InnoDB**.
20 issues flagged, out of 145 computed Variables/Status/Expressions checked
更重要的问题
innodb_max_dirty_pages_pct
设置为零?通常为75(%)。我希望你会遭受很多I / O. log_file_size = 5M
。改为1G;但请注意:更改它很复杂,需要重新启动。Aborted_connects
/ Connections
= 98.8%。 (最多20%是'确定'。)你有RAM磁盘吗?多大?我通常反对这样的观点。但是,如果你有一个RAM磁盘,这可以解释高内存使用率,高查询率,但看起来I / O问题很少。
详细信息和其他观察结果
( innodb_buffer_pool_size / _ram ) = 6,442,450,944 / 16384M = 37.5%
- 用于InnoDB buffer_pool的RAM的百分比
( open_files_limit ) = 1,024
- ulimit -n
- 要允许更多文件,请更改ulimit或/etc/security/limits.conf或sysctl.conf(kern.maxfiles&amp; kern.maxfilesperproc)或其他内容(取决于操作系统)另一方面,Open_table*
值非常低,所以你似乎只使用很少的表。
( innodb_max_dirty_pages_pct ) = 0
- 当buffer_pool开始刷新到磁盘时
- 你在试验吗?
( Innodb_log_writes ) = 26,966,874 / 278186 = 97 /sec
( Innodb_os_log_written / (Uptime / 3600) / innodb_log_files_in_group / innodb_log_file_size ) = 253,091,451,392 / (278186 / 3600) / 2 / 5M = 312
- 比率
( Uptime / 60 * innodb_log_file_size / Innodb_os_log_written ) = 278,186 / 60 * 5M / 253091451392 = 0.096
- InnoDB日志轮换之间的分钟数从5.6.8开始,这可以动态更改;一定要改变my.cnf。
- (轮换之间60分钟的建议有些武断。)调整innodb_log_file_size。
( Questions ) = 889,470,233 / 278186 = 3197 /sec
- 查询(SP外) - “qps”
- &gt; 2000 可能压力服务器
( Queries ) = 85,684,886,985 / 278186 = 308012 /sec
- 查询(包括SP内部)
- &gt; 3000 可能压力服务器
( (Queries-Questions)/Queries ) = (85684886985-889470233)/85684886985 = 99.0%
- 存储例程中的查询的一部分。
- (如果很高则不错;但它会影响其他一些结论的有效性。)
( Created_tmp_tables ) = 1,674,262,702 / 278186 = 6018 /sec
- 创建“临时”表格作为复杂SELECT的一部分的频率。
( Select_scan ) = 837,131,930 / 278186 = 3009 /sec
- 全表扫描
- 添加索引/优化查询(除非它们是小表)
( Select_scan / Com_select ) = 837,131,930 / 2511393099 = 33.3%
- 选择进行全表扫描的百分比。 (可能被Stored Routines愚弄了。)
- 添加索引/优化查询
( Com_insert + Com_delete + Com_delete_multi + Com_replace + Com_update + Com_update_multi ) = (837130735 + 0 + 0 + 0 + 0 + 0) / 278186 = 3009 /sec
- 写/秒
- 50次写入/秒+日志刷新可能会最大化正常驱动器的I / O写入容量
( expire_logs_days ) = 0
- 多久自动清除binlog(在这么多天之后)
- 太大(或零)=消耗磁盘空间;太小=需要快速响应网络/机器崩溃。
(如果log_bin = OFF则不相关)
( long_query_time ) = 10.000000 = 10
- 用于定义“慢”查询的截止(秒)。
- 建议2
( Aborted_connects / Connections ) = 11,455 / 11594 = 98.8%
- 或许黑客试图闯入?
( thread_cache_size ) = 4
- 需要保留多少额外进程(使用线程池时不相关)(自5.6.8起自动调整;基于max_connections)
更多强>
Select_scan / Com_select
非常接近1/3,因为您怀疑自己在执行的查询中有一个强大的模式。也许重复可以避免?同样,Com_set_option/Queries
非常接近1/6。
Handler_read*
值非常小。
嗯... Select_scan
/秒,Com_call_procedure
/秒和Com_insert
/秒都非常相似(3009 /秒)。只有一个程序,它被称为很多?
Innodb_rows_inserted
= 622 /秒。
很抱歉,此分析的大部分内容都是针对性能而非内存。我确实想出了一个记忆。我猜ramdisk是4-5G?