当前位置: 首页 > 知识库问答 >
问题:

MySQL总内存分配使用率?内存泄漏?

司徒墨竹
2023-03-14

我使用5.6.21-70.0进行性能测试。

当我跑步时

mysqlslp-a--并发=40--查询次数1000次--迭代=500次--引擎=innodb--debug-info-utest-p

做一些性能测试,ram增长超过最大内存使用量,永不释放

当完成mysqlslap时,内存显示使用78%

我有1G物理内存,不使用交换

KiB Mem:总共1016656个,使用953808个,免费62848个,30324个缓冲区

KiB交换:总计0,使用0,自由0。41384缓存内存

PID USER PR NI VIRT RES SHR S%CPU%MEM TIME命令26049 mysql 20 0 1544156 778316 3992 S 16.3 76.6 6 6:24.01 mysqld

**mysqld似乎使用了大约700M内存?为什么超过了最大内存使用量?为什么mysql从不释放内存**

我的mysqlturning。pl显示:

[确定]可用连接的最高使用率:70%(42/60)

[确定]键缓冲区大小/总MyISAM索引:32.0M/98.0K

[-]读/写:40%/60%

[-]总缓冲区:336.0M全局1.1M/线程(最多60个线程)

[确定]最大可能内存使用量:403.5M(占已安装RAM的40%)

----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 274726912; in additional pool allocated 0
Total memory allocated by read views 96
Internal hash tables (constant factor + variable factor)
    Adaptive hash index 4446416     (4425832 + 20584)
    Page hash           277432 (buffer pool 0 only)
    Dictionary cache    1170261     (1107952 + 62309)
    File system         815920  (812272 + 3648)
    Lock system         665656  (664936 + 720)
    Recovery system     0   (0 + 0)
Dictionary memory allocated 62309
Buffer pool size        16383
Buffer pool size, bytes 268419072
Free buffers            1024
Database pages          15358
Old database pages      5649
Modified db pages       0
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 407, not young 484
0.00 youngs/s, 0.00 non-youngs/s
Pages read 614, created 17947, written 20737
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
No buffer pool page gets since the last printout
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 15358, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]

我的,我的。cnf公司----

 # Generated by Percona Configuration Wizard (http://tools.percona.com/) version REL5-20120208

 [mysql]

 # CLIENT #
 port                           = 3306
 socket                         = /data/data/mysql.sock

 [mysqld]

 # GENERAL #
 user                           = mysql
 default-storage-engine         = InnoDB
 socket                         = /data/data/mysql.sock
 pid-file                       = /data/data/mysql.pid
 character-set-server=utf8
 collation-server=utf8_general_ci

 # MyISAM #
 key-buffer-size                = 32M
 myisam-recover                 = FORCE,BACKUP

 # SAFETY #
 max-allowed-packet             = 16M
 max-connect-errors             = 1000000
 skip-name-resolve
 sql-mode                       = STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ONLY_FULL_GROUP_BY
 sysdate-is-now                 = 1
 innodb                         = FORCE

 # DATA STORAGE #
 datadir                        = /data/data/

 # BINARY LOGGING #
 log-bin                        = /data/data/mysql-bin
 expire-logs-days               = 14
 sync-binlog                    = 1

 # CACHES AND LIMITS #
 tmp-table-size                 = 32M
 max-heap-table-size            = 32M
 query-cache-type               = 0
 query-cache-size               = 0
 max-connections                = 60
 thread-cache-size              = 50
 open-files-limit               = 65535
 table-definition-cache         = 1024
 table-open-cache               = 2048

 # INNODB #
 innodb-flush-method            = O_DIRECT
 innodb-log-files-in-group      = 2
 innodb-log-file-size           = 64M
 innodb-flush-log-at-trx-commit = 1
 innodb-file-per-table          = 1
 innodb-buffer-pool-size        = 64M

 # LOGGING #
 log-error                      = /data/data/mysql-error.log
 log-queries-not-using-indexes  = 0 # slow will not log the query which do not use index
 long-query-time                = 1
 slow-query-log                 = 1
 slow-query-log-file            = /data/data/mysql-slow.log

共有2个答案

程飞星
2023-03-14

尝试在InnoDB表上运行FLUSH TABLES它将关闭针对. ibd文件的文件。我希望它会释放内存使用!!

你可能正在使用一台32位的机器,它通常提供3G左右的数据,但你使用了40%的物理内存,这已经足够了,但我认为你需要扩展呼吸空间,你肯定需要允许缓冲区大小略大于数据或索引页的大小。

尝试使用64位机器,使用交换将使它更容易呼吸,包括更大大小的数据/索引大小的缓冲池。

邵锐
2023-03-14

我已经发现为什么内存泄漏发生。现在我只有1GB内存,没有交换。

performance_schema导致在启动时分配大约400M的内存。

因为my.cnf使用

table-definition-cache= 1024
table-open-cache= 2048 
max-connections= 60

会造成高performance_schema分配,更多信息请看

REF1

参考文献2

 类似资料:
  • 问题内容: 好的,所以我的程序有很多(〜300)线程,每个线程都与中央数据库通信。我创建了一个与数据库的全局连接,然后每个线程进行其业务创建语句并执行它们。 一路上的某个地方,我发生了大量内存泄漏。在分析堆转储之后,我看到com.mysql.jdbc.JDBC4Connection对象为70 MB,因为它在“ openStatements”(哈希映射)中有800,000个项目。在某个地方,它不能正

  • 我想了解为什么多次动态分配调用的数据比直接在代码中指定的或通过的单个调用分配的数据使用如此多的内存。 例如,我用C编写了以下两个代码: 测试1.c:int x用malloc分配 我在这里没有使用free来保持简单。当程序等待交互时,我查看另一个终端中的顶级功能,它向我显示了以下内容: test2. c: int x不是动态分配的 顶部显示: 我还编写了第三个代码,其结果与test2相同,我在tes

  • 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏大家都不陌生了,简单粗俗的讲,就是该被释放的对象没有释放,一直被某个或某些实例所持有却不再被使用导致 GC 不能回收 我会从 java 内存泄漏的基础知识开始,并通过具体例子来说明 Android 引起内存泄漏的各种原因,以及如何利用工具来分析应用内存泄漏,最后再做总结。 篇幅有些长,大家可以分几节来看! Java

  • 问题内容: 我认为我的android应用正在泄漏内存。我不是绝对确定这是问题所在。 应用程序打开时经常崩溃,并且logcat尝试加载位图图像时会显示“内存不足”异常。 崩溃后,我重新打开了该应用程序,它运行正常。Logcat会显示许多“ gc”,并且JIT表会不时地向上调整大小,而不会向下调整,直到应用程序因内存不足错误而崩溃。 这听起来像是内存泄漏吗?如果是这样,我该如何定位和关闭泄漏点。 这是

  • 问题内容: 我一直在追寻内存泄漏(由“ valgrind –leak-check = yes”报告),它似乎来自ALSA。这段代码已经存在于自由世界中一段时间​​了,所以我猜这是我做错的事情。 输出看起来像这样: 并继续一些页面 这是由于我在一个项目中使用ALSA并开始看到这种巨大的泄漏……或者至少是所说泄漏的报告。 所以问题是:是我,ALSA或valgrind在这里遇到问题吗? 问题答案: ht

  • 问题内容: 我有一个长时间运行的脚本,如果让脚本运行足够长的时间,它将消耗系统上的所有内存。 在不详细介绍脚本的情况下,我有两个问题: 是否有可遵循的“最佳实践”,以防止泄漏发生? 有什么技术可以调试Python中的内存泄漏? 问题答案: 看看这篇文章:跟踪python内存泄漏 另外,请注意,垃圾收集模块实际上可以设置调试标志。看一下功能。此外,请查看Gnibbler的这段代码,以确定调用后已创建