我创建了以下过程:
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 ;
当我运行这个过程时,我得到以下信息:
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个线程:
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。工作集应该是进程使用的物理内存,包括内存映射文件。
为什么这比任务管理器显示的要低呢?
发布于 2023-03-21 17:30:48
由MySQL调谐器等工具推广的所谓内存使用公式实际上是误导性的。您不应该将此作为内存使用的估计值。
理论上的最大记忆在实践中从未发生过。
许多名为每线程缓冲区的缓冲区仅根据某些查询的需要分配。您的流程列表没有显示实际运行的查询,因此没有使用这样的缓冲区。
几乎不可能让max_connections
上的每个处理器列表插槽同时运行一个查询,并且每个查询都将每种类型的缓冲区分配到最大大小。
同样,临时表。如果您没有运行创建临时表的查询,它为什么要为临时表分配最大RAM?
还请记住,在理论上,可以通过相同的查询多次分配某些图形,如join缓冲区和temp表大小。但是,在分配所有其他缓冲区的同时发生这种情况也是非常罕见的。
如果将理论上的最大内存分配公式视为典型的内存分配,那么我分析过的每个MySQL服务器实例都将使用服务器上的物理内存数量的许多倍。但这是不可能的。
判断正在使用的内存的更好方法是查询sys视图,如下所示:
select event_name, current_alloc
from sys.x$memory_global_by_current_bytes;
发布于 2023-04-05 20:03:34
如果innodb_buffer_pool_size
约占可用内存的70% (考虑了my.cnf等),如果在my.cnf中变化不大,则应该可以。
交换是一个很大的性能问题--避免它。
我同意Bill的说法,MySQL内存使用的每一个公式都是假的。我认为任务经理经常提供虚假的信息。
https://dba.stackexchange.com/questions/324977
复制相似问题