GreatSQL社区

搜索

[待回复] 数据库中的内存占用较大,查找谁占用了buffer外的内存

540 12 2025-8-13 09:38


数据库版本:Server version: 8.0.32-26 GreatSQL (GPL), Release 26,
操作系统:UnionTech OS Server 20
top截图:


free -g输出:

              total        used        free      shared  buff/cache   available
Mem:            125          76           0          35          48          12
Swap:             3           3           0


my.cnf里面有关于内存的配置参数:

key_buffer_size = 4096M
max_allowed_packet = 512M
read_rnd_buffer_size = 32M
thread_cache_size = 300
innodb_buffer_pool_size = 20G
max_heap_table_size = 256M
join_buffer_size = 16M
tmp_table_size = 256M
table_open_cache = 2048
bulk_insert_buffer_size = 64M
read_buffer_size = 16M
sort_buffer_size = 16M
net_buffer_length = 8K
myisam_sort_buffer_size = 8M

max_connections = 8000

上面的innodb_buffer_pool_size才20G,其他零零散散加起来应该也不会到70G吧?
我查了下下面的语句:

全局总内存25G左右:
mysql> select * from sys.memory_global_total;
+-----------------+
| total_allocated |
+-----------------+
| 25.37 GiB       |
+-----------------+
1 row in set (0.01 sec)


会话内存:

mysql> select thd_id,conn_id, current_memory from sys.session where current_memory like '%M%' order by 3;
+----------+----------+----------------+
| thd_id   | conn_id  | current_memory |
+----------+----------+----------------+
| 72690195 | 61473587 | 1.21 MiB       |
| 72712200 | 61493864 | 1.25 MiB       |
| 72709387 | 61491275 | 1.31 MiB       |
| 72718318 | 61499534 | 1.31 MiB       |
| 72715663 | 61497071 | 1.35 MiB       |
| 72706233 | 61488401 | 1.46 MiB       |
| 72710791 | 61492583 | 1.48 MiB       |
| 72627503 | 61415759 | 1.53 MiB       |
| 72716667 | 61498011 | 1.58 MiB       |
| 72716664 | 61498008 | 1.80 MiB       |
| 72672172 | 61456876 | 1.91 MiB       |
| 72641324 | 61428492 | 1.97 MiB       |
| 72717818 | 61499066 | 17.34 MiB      |
| 72693278 | 61476446 | 18.19 MiB      |
| 72716495 | 61497847 | 2.05 MiB       |
| 72704410 | 61486714 | 2.07 MiB       |
|       56 |        5 | 2.14 MiB       |
| 72696072 | 61479016 | 4.10 MiB       |
| 72712192 | 61493856 | 4.16 MiB       |
| 72704420 | 61486716 | 5.80 MiB       |
| 72684324 | 61468196 | 6.51 MiB       |
| 72683907 | 61467811 | 7.46 MiB       |
+----------+----------+---


+----------+----------+----------------+
22 rows in set (0.27 sec)

过滤的kib的,kib的200多个,没有gb的连接
这样算起来也没有达到70G吧,那是什么消耗了内存呢?
有没有大佬解解惑?
全部回复(12)
yejr 2025-8-13 09:57:14
补充提供几个信息

1、查询结果
  1. SHOW ENGINE INNODB STATUS\G
复制代码


2、查询结果
  1. select event_name,SUM_NUMBER_OF_BYTES_ALLOC  from
  2.   performance_schema.memory_summary_global_by_event_name
  3.     order by SUM_NUMBER_OF_BYTES_ALLOC desc LIMIT 10;
复制代码


3、查询结果
  1. SHOW GLOBAL STATUS;
复制代码


4、查询结果
  1. SHOW PROCESSLIST;
复制代码

5、查询结果
  1. select event_name, SUM_NUMBER_OF_BYTES_ALLOC from
  2.   performance_schema.memory_summary_by_thread_by_event_name
  3.     order by SUM_NUMBER_OF_BYTES_ALLOC desc limit 20;
复制代码


以上结果最好是提供文本原文内容或作为附件上传
wrh 2025-8-13 10:08:12
yejr 发表于 2025-8-13 09:57
补充提供几个信息

1、查询结果

附件里面有输出内容

log.rar

18.4 KB, 下载次数: 1, 下载积分: 金币 -1

yejr 2025-8-13 11:01:22
wrh 发表于 2025-8-13 10:08
附件里面有输出内容

从你提供的信息来看,至少存在以下几个问题

1、分配的ibp太低了,严重不足
对应指标
| Innodb_buffer_pool_wait_free                           | 7564050

物理内存有125G,却只给ibp分配20G,至少先分配50%吧

2、分配的innodb log buffer不足
指标
| Innodb_log_waits                                       | 39

看不到你的innodb_log_buffer_size参数值多大,一般可以设置32MB左右

3、垃圾SQL太多
指标
| Slow_queries                                           | 44024796
| Innodb_row_lock_time_avg                               | 124

应尽快优化这些垃圾SQL

4、内存临时表buffer可能设置太小
指标
| Created_tmp_disk_tables                                | 7118057
| Created_tmp_tables                                     | 93994727

看不到你的tmp_table_size 和 max_heap_table_size 参数值多大,应适当加大,一般可以设置96MB左右
wrh 2025-8-13 11:17:31
本帖最后由 wrh 于 2025-8-13 11:20 编辑
yejr 发表于 2025-8-13 11:01
从你提供的信息来看,至少存在以下几个问题

1、分配的ibp太低了,严重不足

1、分配的ibp太低了,严重不足
对应指标
| Innodb_buffer_pool_wait_free                           | 7564050

物理内存有125G,却只给ibp分配20G,至少先分配50%吧


关于这一点,我的物理内存已经占用了78G了,过一半了,在增加,就是把这个增加到50%会保护有风险?
其他的输出

mysql> show variables like 'innodb_log_buffer_size';
+------------------------+----------+
| Variable_name          | Value    |
+------------------------+----------+
| innodb_log_buffer_size | 16777216 |
+------------------------+----------+
1 row in set (0.02 sec)

mysql> show variables like '%tmp_table%';
+----------------+-----------+
| Variable_name  | Value     |
+----------------+-----------+
| tmp_table_size | 268435456 |
+----------------+-----------+
1 row in set (0.00 sec)

mysql> show variables like 'max_heap_table_size';
+---------------------+-----------+
| Variable_name       | Value     |
+---------------------+-----------+
| max_heap_table_size | 268435456 |
+---------------------+-----------+
1 row in set (0.01 sec)

mysql>

yejr 2025-8-13 12:15:23
wrh 发表于 2025-8-13 11:17
1、分配的ibp太低了,严重不足
对应指标
| Innodb_buffer_pool_wait_free                           | 75 ...

先调大 innodb_buffer_pool_size(不放心就先一点点加大),同步优化垃圾SQL吧
wrh 2025-8-13 12:28:28
yejr 发表于 2025-8-13 12:15
先调大 innodb_buffer_pool_size(不放心就先一点点加大),同步优化垃圾SQL吧

垃圾sql的话,他表里面就200,300条数据,这种也优化?
mysql是不是也是建议用绑定变量?
yejr 2025-8-13 12:35:29
wrh 发表于 2025-8-13 12:28
垃圾sql的话,他表里面就200,300条数据,这种也优化?
mysql是不是也是建议用绑定变量? ...

优化垃圾SQL只能具体问题具体分析了,没有定式,可以参考文档:https://greatsql.cn/docs/8.0.32-27/12-dev-guide/12-7-4-sql-optimize-slowsql.html
yejr 2025-8-13 14:23:51
看你提供的截图,mysqld进程当前CPU利用率是463%,这通常是因为SQL效率很低(这个概率更高些)或者因为行锁导致的
此外,也强烈建议安装 jemalloc 取代原生的 glibc,它的内存分配管理效率更高也更安全,参考:https://greatsql.cn/docs/8.0.32-27/4-install-guide/1-install-prepare.html#%E5%85%B6%E4%BB%96
wrh 2025-8-13 15:48:09
yejr 发表于 2025-8-13 14:23
看你提供的截图,mysqld进程当前CPU利用率是463%,这通常是因为SQL效率很低(这个概率更高些)或者因为行锁 ...

这个又这个lib
[root@fjgd-ccps-db-0001 wrh]# ls -la /usr/lib64/libjemalloc.so*
-rwxr-xr-x 1 root root 543288 Feb 12  2022 /usr/lib64/libjemalloc.so.2
12下一页
wrh

4

主题

0

博客

27

贡献

新手上路

Rank: 1

积分
43

助人为乐(铜)

合作电话:010-64087828

社区邮箱:greatsql@greatdb.com

社区公众号
社区小助手
QQ群
GMT+8, 2025-9-8 04:43 , Processed in 0.034557 second(s), 19 queries , Redis On.
快速回复 返回顶部 返回列表