首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySQL的内存使用

MySQL的内存使用
EN

Database Administration用户
提问于 2023-03-21 13:38:06
回答 2查看 114关注 0票数 0

我创建了以下过程:

代码语言:javascript
运行
复制
CREATE DATABASE memory
USE memory

DELIMITER $

DROP PROCEDURE IF EXISTS `my_memory` $
CREATE PROCEDURE `my_memory` ()
BEGIN
DECLARE var LONGTEXT; 
DECLARE val LONGTEXT; 
DECLARE done INT;
#Variables for storing calculations
DECLARE GLOBAL_SUM DOUBLE;
DECLARE PER_THREAD_SUM DOUBLE;
DECLARE MAX_CONN DOUBLE;
DECLARE HEAP_TABLE DOUBLE;
DECLARE TEMP_TABLE DOUBLE;
#Cursor for Global Variables
#### For MySQL 5.1+
DECLARE CUR_GBLVAR CURSOR FOR SELECT * FROM information_schema.GLOBAL_VARIABLES;
#### Ref: http://bugs.mysql.com/bug.php?id=49758
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
SET GLOBAL_SUM=0;
SET PER_THREAD_SUM=0;
SET MAX_CONN=0;
SET HEAP_TABLE=0;
SET TEMP_TABLE=0;
OPEN CUR_GBLVAR;
mylp:LOOP
      FETCH CUR_GBLVAR INTO var,val;
  IF done=1 THEN
    LEAVE mylp;
  END IF;
    IF var in ('key_buffer_size','innodb_buffer_pool_size','innodb_additional_mem_pool_size','innodb_log_buffer_size','query_cache_size') THEN
    #Summing Up Global Memory Usage
      SET GLOBAL_SUM=GLOBAL_SUM+val;
    ELSEIF var in ('read_buffer_size','read_rnd_buffer_size','sort_buffer_size','join_buffer_size','thread_stack','max_allowed_packet','net_buffer_length') THEN
    #Summing Up Per Thread Memory Variables
      SET PER_THREAD_SUM=PER_THREAD_SUM+val;
    ELSEIF var in ('max_connections') THEN
    #Maximum allowed connections
      SET MAX_CONN=val;
    ELSEIF var in ('max_heap_table_size') THEN
    #Size of Max Heap tables created
      SET HEAP_TABLE=val;
    #Size of possible Temporary Table = Maximum of tmp_table_size / max_heap_table_size.
    ELSEIF var in ('tmp_table_size','max_heap_table_size') THEN
      SET TEMP_TABLE=if((TEMP_TABLE>val),TEMP_TABLE,val);
    END IF;
END LOOP;
CLOSE CUR_GBLVAR;
#Summerizing:
select "Global Buffers" as "Parameter",CONCAT(GLOBAL_SUM/(1024*1024),' M') as "Value" union
select "Per Thread",CONCAT(PER_THREAD_SUM/(1024*1024),' M')  union
select "Maximum Connections",MAX_CONN union
select "Total Memory Usage",CONCAT((GLOBAL_SUM + (MAX_CONN * PER_THREAD_SUM))/(1024*1024),' M') union
select "+ Per Heap Table",CONCAT(HEAP_TABLE / (1024*1024),' M') union
select "+ Per Temp Table",CONCAT(TEMP_TABLE / (1024*1024),' M');
END $

DELIMITER ;

当我运行这个过程时,我得到以下信息:

代码语言:javascript
运行
复制
mysql>  call my_memory();
+---------------------+------------+
| Parameter          | Value      |
+---------------------+------------+
| Global Buffers      | 1131 M    |
| Per Thread          | 5.078125 M |
| Maximum Connections | 200        |
| Total Memory Usage  | 2146.625 M |
| + Per Heap Table    | 16 M      |
| + Per Temp Table    | 134 M      |
+---------------------+------------+
6 rows in set (0.02 sec)
Query OK, 0 rows affected (0.06 sec)

从这些信息中,我们知道以下内容:总内存使用量=全局缓冲区+(每个线程的内存x最大连接)。= 1131 + (5.078125 x 200) = 1131 + 1015.625 =2 146.625

当我列出所有线程时,大约有50个线程:

代码语言:javascript
运行
复制
mysql> SHOW FULL PROCESSLIST;
+--------+------+-----------------+------+---------+------+-------+-----------------------+
| Id    | User | Host            | db  | Command | Time | State | Info                  |
+--------+------+-----------------+------+---------+------+-------+-----------------------+
| 226874 | root | localhost:58812 | NULL | Query  |    0 | init  | SHOW FULL PROCESSLIST |
| 226903 | wms  | localhost:59532 | wms  | Sleep  |    0 |      | NULL                  |
| 226904 | wms  | localhost:59533 | wms  | Sleep  |    0 |      | NULL                  |
| 226908 | wms  | localhost:59574 | wms  | Sleep  |  592 |      | NULL                  |
| 226911 | wms  | localhost:59603 | wms  | Sleep  |    1 |      | NULL                  |
| 226926 | wms  | localhost:59976 | wms  | Sleep  |    0 |      | NULL                  |
| 226927 | wms  | localhost:60070 | wms  | Sleep  |    1 |      | NULL                  |
| 226945 | wms  | localhost:60395 | wms  | Sleep  |    6 |      | NULL                  |
| 226970 | wms  | localhost:61265 | wms  | Sleep  |    1 |      | NULL                  |
| 226975 | wms  | localhost:61378 | wms  | Sleep  |  147 |      | NULL                  |
| 226984 | wms  | localhost:61990 | wms  | Sleep  |  628 |      | NULL                  |
| 226985 | wms  | localhost:61991 | wms  | Sleep  |  628 |      | NULL                  |
| 226986 | wms  | localhost:61992 | wms  | Sleep  |  628 |      | NULL                  |
| 226987 | wms  | localhost:62087 | wms  | Sleep  |  600 |      | NULL                  |
| 226988 | wms  | localhost:62088 | wms  | Sleep  |  600 |      | NULL                  |
| 226989 | wms  | localhost:62145 | wms  | Sleep  |  568 |      | NULL                  |
| 226990 | wms  | localhost:62227 | wms  | Sleep  |  540 |      | NULL                  |
| 226991 | wms  | localhost:62333 | wms  | Sleep  |  508 |      | NULL                  |
| 226992 | wms  | localhost:62334 | wms  | Sleep  |  508 |      | NULL                  |
| 226993 | wms  | localhost:62335 | wms  | Sleep  |  508 |      | NULL                  |
| 226994 | wms  | localhost:62366 | wms  | Sleep  |  478 |      | NULL                  |
| 226995 | wms  | localhost:62367 | wms  | Sleep  |  478 |      | NULL                  |
| 226996 | wms  | localhost:62371 | wms  | Sleep  |  450 |      | NULL                  |
| 226997 | wms  | localhost:62372 | wms  | Sleep  |  448 |      | NULL                  |
| 226998 | wms  | localhost:62431 | wms  | Sleep  |  388 |      | NULL                  |
| 226999 | wms  | localhost:62432 | wms  | Sleep  |  388 |      | NULL                  |
| 227000 | wms  | localhost:62507 | wms  | Sleep  |  360 |      | NULL                  |
| 227001 | wms  | localhost:62508 | wms  | Sleep  |  360 |      | NULL                  |
| 227002 | wms  | localhost:62731 | wms  | Sleep  |  270 |      | NULL                  |
| 227003 | wms  | localhost:62732 | wms  | Sleep  |  270 |      | NULL                  |
| 227004 | wms  | localhost:62733 | wms  | Sleep  |  270 |      | NULL                  |
| 227005 | wms  | localhost:62734 | wms  | Sleep  |  270 |      | NULL                  |
| 227006 | wms  | localhost:62735 | wms  | Sleep  |  270 |      | NULL                  |
| 227007 | wms  | localhost:62736 | wms  | Sleep  |  270 |      | NULL                  |
| 227008 | wms  | localhost:62737 | wms  | Sleep  |  270 |      | NULL                  |
| 227009 | wms  | localhost:62741 | wms  | Sleep  |  270 |      | NULL                  |
| 227010 | wms  | localhost:62742 | wms  | Sleep  |  270 |      | NULL                  |
| 227011 | wms  | localhost:62743 | wms  | Sleep  |  270 |      | NULL                  |
| 227012 | wms  | localhost:62869 | wms  | Sleep  |  210 |      | NULL                  |
| 227013 | wms  | localhost:62870 | wms  | Sleep  |  208 |      | NULL                  |
| 227014 | wms  | localhost:62901 | wms  | Sleep  |  180 |      | NULL                  |
| 227015 | wms  | localhost:62902 | wms  | Sleep  |  180 |      | NULL                  |
| 227016 | wms  | localhost:62904 | wms  | Sleep  |  150 |      | NULL                  |
| 227017 | wms  | localhost:62945 | wms  | Sleep  |  90 |      | NULL                  |
| 227018 | wms  | localhost:62946 | wms  | Sleep  |  88 |      | NULL                  |
| 227019 | wms  | localhost:62974 | wms  | Sleep  |  58 |      | NULL                  |
| 227020 | wms  | localhost:62975 | wms  | Sleep  |  58 |      | NULL                  |
| 227021 | wms  | localhost:63020 | wms  | Sleep  |  30 |      | NULL                  |
| 227022 | wms  | localhost:63021 | wms  | Sleep  |  30 |      | NULL                  |
| 227023 | wms  | localhost:63022 | wms  | Sleep  |  30 |      | NULL                  |
| 227024 | wms  | localhost:63027 | wms  | Sleep  |  28 |      | NULL                  |
+--------+------+-----------------+------+---------+------+-------+-----------------------+

为什么my_memory()过程添加1015.625 MB (200x5.078125)作为总内存中的一个值?应该是50 x 5.078125 MB,因为只有50个线程处于活动状态?

在任务管理器中,它显示了使用1011 MB内存的MySQL。为什么这与显示总使用量为2146MB的MySQL过程不同?

使用process,它将私有字节显示为1,696.440 KB,工作集为741,956 K。工作集应该是进程使用的物理内存,包括内存映射文件。

为什么这比任务管理器显示的要低呢?

EN

回答 2

Database Administration用户

发布于 2023-03-21 17:30:48

由MySQL调谐器等工具推广的所谓内存使用公式实际上是误导性的。您不应该将此作为内存使用的估计值。

理论上的最大记忆在实践中从未发生过。

许多名为每线程缓冲区的缓冲区仅根据某些查询的需要分配。您的流程列表没有显示实际运行的查询,因此没有使用这样的缓冲区。

几乎不可能让max_connections上的每个处理器列表插槽同时运行一个查询,并且每个查询都将每种类型的缓冲区分配到最大大小。

同样,临时表。如果您没有运行创建临时表的查询,它为什么要为临时表分配最大RAM?

还请记住,在理论上,可以通过相同的查询多次分配某些图形,如join缓冲区和temp表大小。但是,在分配所有其他缓冲区的同时发生这种情况也是非常罕见的。

如果将理论上的最大内存分配公式视为典型的内存分配,那么我分析过的每个MySQL服务器实例都将使用服务器上的物理内存数量的许多倍。但这是不可能的。

判断正在使用的内存的更好方法是查询sys视图,如下所示:

代码语言:javascript
运行
复制
select event_name, current_alloc 
from sys.x$memory_global_by_current_bytes;
票数 1
EN

Database Administration用户

发布于 2023-04-05 20:03:34

如果innodb_buffer_pool_size约占可用内存的70% (考虑了my.cnf等),如果在my.cnf中变化不大,则应该可以。

交换是一个很大的性能问题--避免它。

我同意Bill的说法,MySQL内存使用的每一个公式都是假的。我认为任务经理经常提供虚假的信息。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/324977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档