01.26.2024 Update Below. 01.25.2024 Update Below. 一百零二
此处提供服务器详细信息:Server Details
我们有一个问题,我们的后端系统的一些旧的(坏的)遗留代码保持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.process list的照片.
老实说,我不知道如何深入调查才能了解发生了什么.
下面是一个使用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;