MySQL 8.0.34 - 从后端系统管理 AWS RDS 上的持久连接内存使用情况

问题描述 投票:0回答:1

2024 年 1 月 26 日更新如下 2024 年 1 月 25 日更新如下 2024年1月24日更新如下

服务器详细信息在这里:服务器详细信息

我们遇到一个问题,后端系统的一些旧(坏)遗留代码使 MySQL 连接保持打开状态数天,并将它们用于大量不同的事情,这正在消耗我们系统的可用内存。

如果是长期重用的连接(其中一些每个连接可以容纳 200MB 以上),是否有任何方法可以控制连接允许“吃”的内存量?有没有办法让连接释放其内存保留而不断开连接?

在后端团队致力于编写更好的连接管理代码时尝试找到解决方案(他们不应该无限期地保持连接打开)。

这是连接 RAM 的图片。太疯狂了。

这个问题的核心部分是我无法找到 100% 准确且明确的信息来说明到底哪些参数定义了连接的内存限制。一个网站说有一个分组,另一个网站则有……另一个分组。一个网站说 @@tmp_table_size 是基于连接的,另一个网站说它是“全局”的。我不敢相信那里有多少相互冲突的信息......所以现在我什至无法弄清楚哪些参数定义了连接的最大内存使用量。任何有关这方面的确认细节将不胜感激。

这是我被告知控制每个连接的内存限制的参数值。

@@max_allowed_packet: 64MB
@@sort_buffer_size: 3.81MB
@@read_buffer_size: 256KB
@@read_rnd_buffer_size: 512KB
@@join_buffer_size: 256KB
@@net_buffer_length: 16KB
@@tmp_table_size: 16777216 (107.50MB)
@@max_heap_table_size: 16777216 (16MB)

更令人困惑的是,这是最近的快照,显示线程超过 300MB,接近 400MB。这怎么可能?

这是显示 sys.processlist 的另一张照片。

老实说,我不知道如何深入研究以了解发生了什么......

这是使用 132MB 的线程的快照。请注意,这是我们重新启动服务器之后的结果,因此它不接近 400MB 的水平。注意到什么奇怪的事情了吗?

这是我用来获取线程和进程的内存详细信息的 SQL:

  -- Memory used by the processes.
SELECT
    th.THREAD_ID,
    th.PROCESSLIST_ID,
    th.PROCESSLIST_USER,
    th.PROCESSLIST_HOST,
    th.PROCESSLIST_DB,
    th.PROCESSLIST_COMMAND,
    th.PROCESSLIST_TIME,
    ev.EVENT_NAME,
    FORMAT_BYTES(ev.CURRENT_NUMBER_OF_BYTES_USED)
FROM
  performance_schema.threads th
  JOIN performance_schema.memory_summary_by_thread_by_event_name ev
  ON th.THREAD_ID = ev.THREAD_ID
WHERE
  ev.EVENT_NAME LIKE 'memory/%' and th.PROCESSLIST_USER IS NOT NULL AND th.PROCESSLIST_USER <> 'rdsrepladmin' AND th.PROCESSLIST_USER <> 'empoweradmin43'
ORDER BY
ev.CURRENT_NUMBER_OF_BYTES_USED DESC, th.PROCESSLIST_TIME DESC;
mysql connection amazon-rds
1个回答
0
投票

每秒速率 = RPS 或 RPhr

针对 AWS RDS 参数组考虑的建议,

静态变量(需要停止/启动实例),

innodb_buffer_pool_instances=2  # from 8 until you have more cores - if ever
innodb_open_files=40000  # from 4000 to reduce opened_tables RPhr of 18,127
table_open_cache_instances=2  # from 8 you only have 2 cores

动态变量, temptable_max_mmap=268435456 # 从 1G 开始,因为你只有 8G 可用 temptable_max_ram=268435456 # 从 1G 开始,因为你只有 8G 可用 table_open_cache=40000 # 从 4000 减少匹配 innodb_open_files

观察, 在显示全局状态结果中,threads_connected 显示为 60。 这是Java代码连接、处理、关闭不通的症状 处理完成后关闭连接并保留正在使用的资源。 建议搜索“java mysql connect进程关闭教程”,多看一篇文章来释放资源

有更多机会调整全局变量以提高性能。

© www.soinside.com 2019 - 2024. All rights reserved.