最近我的系统与mysql(从技术上讲是mariadb)的连接不足,出现了一些问题。
我已经将max\u连接设置为250(从151增加)。但我对如何分配内存感到困惑。这台机器有32gb的内存,如果我从mysqltuner正确读取结果。。。我只允许总共使用1gb。但是在250个连接*2.8m/线程的情况下,它应该只能达到700m+328m的总长度?
看起来我们已经达到了755米的峰值。但是有了这些额外的记忆,我应该打开一些东西让mariadb呼吸吗?
我读对了吗?
这台机器兼作apache&db服务器。即使在全倾斜我很少看到机器使用超过3或4gb的总系统内存
我运行了mysqltuner,下面是性能结果:
-------- Performance Metrics -----------------------------------------------------------------------
[--] Up for: 34d 1h 32m 42s (74M q [25.213 qps], 26M conn, TX: 46G, RX: 42G)
[--] Reads / Writes: 98% / 2%
[--] Binary logging is disabled
[--] Physical Memory : 31.5G
[--] Max MySQL memory : 1.0G
[--] Other process memory: 647.4M
[--] Total buffers: 328.0M global + 2.8M per thread (250 max threads)
[--] P_S Max memory usage: 0B
[--] Galera GCache Max memory usage: 0B
[OK] Maximum reached memory usage: 755.5M (2.34% of installed RAM)
[OK] Maximum possible memory usage: 1.0G (3.20% of installed RAM)
[OK] Overall possible memory usage with other process is compatible with memory available
[OK] Slow queries: 0% (0/74M)
[OK] Highest usage of available connections: 60% (152/250)
[OK] Aborted connections: 0.00% (2/26423553)
[!!] name resolution is active : a reverse name resolution is made for each new connection and can reduce performance
[!!] Query cache may be disabled by default due to mutex contention.
[OK] Query cache efficiency: 45.7% (21M cached / 47M selects)
[OK] Query cache prunes per day: 0
[OK] Sorts requiring temporary tables: 1% (541 temp sorts / 32K sorts)
[!!] Joins performed without indexes: 24537
[OK] Temporary tables created on disk: 1% (644 on disk / 51K total)
[OK] Thread cache hit rate: 98% (383K created / 26M connections)
[!!] Table cache hit rate: 0% (120 open / 36K opened)
[OK] Open file limit used: 0% (24/4K)
[OK] Table locks acquired immediately: 99% (5M immediate / 5M locks)
1条答案
按热度按时间ggazkfy81#
你必须明白mysqltuner对“最大mysql内存”的计算完全是胡说八道。
它是基于理论上的最大值-这是可能的,只有当你最大化了
max_connections
,然后每个连接在完全相同的时刻运行一个查询,并且每个查询都使用最大可能的排序缓冲区、读取缓冲区和联接缓冲区。实际上,这在真正的服务器上永远不会发生。当我在我支持的大多数生产数据库服务器上运行mysqltuner时,“最大mysql内存”报告为服务器上实际物理ram的数百倍。这不是一个问题,因为这是一个理论上永远不会发生的最大值。
如果你跑了
SHOW PROCESSLIST
在数据库服务器上,即使连接了所有150或250个线程,也只能看到6-8个线程运行查询,而大多数其他线程都处于“睡眠”状态。就好像你是用
ssh
你的终端在一个shell提示符下准备就绪。你在执行命令吗?不,你的壳是空的。但你还是有联系的。mysql也是如此。您的应用程序可能已连接到数据库,但您的应用程序尚未运行查询。即使它确实运行了一个查询,它也可能不会使用允许的最大资源。然后它会很快完成,并再次将连接返回到空闲状态。
在任何给定的时刻,连接的线程数都可能很高,即使那些实际运行查询的连接很小。您可以比较:
以上是一个繁忙的mysql示例的典型数字。根据我的经验,连接到运行的线程的比率在10:1到100:1之间。
但是mysqltuner的计算是不现实的——他们假设连接到运行线程的线程的比率是1:1。
因此,分配给mysql的内存与
max_connections
你允许。您可能会发现增加一些调优选项有助于提高性能,但这与数据的大小以及针对该数据运行的查询的类型有关。
我建议你读书https://www.percona.com/blog/2016/10/12/mysql-5-7-performance-tuning-immediately-after-installation/
或者如果你想深入研究,请阅读:高性能mysql,第3版