01.26.2024 Update Below. 01.25.2024 Update Below. 一百零二

此处提供服务器详细信息:Server Details

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

如果一个连接是一个长期重复使用的连接(有些连接每个连接占用200MB以上),那么有什么方法可以控制它被允许"吃掉"的内存量吗?有没有办法在不断开连接的情况下让连接释放其内存占用?

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

这是一张连接RAM的图片.这简直是疯了.

RAM usage of our Read Replica

这个问题的一个核心部分是,我找不到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.这怎么可能

2nd capture

这是另一张显示sys.process list的照片.

sys.processlist

老实说,我不知道如何深入调查才能了解发生了什么.

下面是一个使用132MB的线程的快照.注意,这是在我们重新启动服务器之后,所以它没有接近400MB级别.注意到什么奇怪的事了吗?

enter image description here

下面是我用来获取线程和进程的内存细节的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;

推荐答案

每秒速率= 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#减少匹配的Innodb_OPEN_FILES

观察, threads_connected在show global status结果中显示为60. 这是Java代码连接、处理、关闭所没有的症状 当处理完成时,关闭连接并使资源处于使用状态. 建议搜索"java mysql connect process close tutorial",多看一篇文章发布资源.

还有更多机会调整全局变量以提高绩效.

Mysql相关问答推荐

mysql查询汇总数据

如何重新采样SQL数据库

使用JSON_CONTAINS搜索多个值的原理

MySQL多次联接同一个表使计数变得奇怪

根据日期重叠转换表格

避免多个SQL查询的重构代码

"Shelf服务器容器访问MySQL Docker容器时出现SocketException异常"

如何将数据导入MySQL中的master/replica struct

MySQL Join 查询位置从订单

正则表达式模式相当于 mysql 中的 %word%

如何判断嵌套查询返回的元组中的每个条目是否相同?

SUBSTRING_INDEX 获取第 n 个值

为什么在有 BEGIN 和 END 时为存储过程指定分隔符?

什么是 PyMySQL,它与 MySQLdb 有何不同?它会影响 Django 部署吗?

MYSQL:创建表中的索引关键字以及何时使用它

MySQL 整数与日期时间索引

判断多个列的一个值

从 MySQL JSON 数据类型中提取不带引号的值

MySQL:切换 int 字段值的简单方法

带有 LIKE 运算符的 Select 语句中的 MySQL case