关于开发环境中Mysql数据库经常内存不够用的情况

事情是这个样子,开发环境的数据库都统一放在180服务器上,大大小小的有将近几十个库,每个开发人员通过SQLyog客户端连接数据库。

服务器配置:16045MB内存,正常启动占用内存1800MB左右,数据库启动后占用8000MB左右,也就是说光Mysql启动就占用了6G的内存。

当然,这样计算肯定不准确,建议top然后shift + M按内存排序后,查看百分比。

用不了多久,可用内存刷刷的下降,导致机器卡死,SSH连接都慢的要死。

网络了许久,值得注意一下几点:

本地的连接池尽量配置的足够小,MaxActive以及MinIdle参数设置为2-3即可,毕竟自己用,基本不存在并发的情况。

TimeBetweenEvictionRunsMillis参数尽量设置为0,避免定时调用,前提尽量大家都保持程序的严谨性,避免出现连接没有释放的情况。

连接池的创建和维护是很大一部分开销,相关配置bean中的dataSource参数destroy-method="close"建议配置,不然本地重启Tomcat次数太频繁,可能会导致链接没有释放,最终180连接被耗尽,导致系统无法启动。

180数据库,建议平时多使用命令访问(因为线上环境,为了安全,一般是不对外开放数据库端口的)。

你以为这就是结局么?

事情其实并没有想象的那么美好,数据库吃内存,比狗吃屎吃的还快。
继续 free -m 了一下,发现buff/cache 还有将近6G的内存,居然一直没有释放。

修改/proc/sys/vm/drop_caches,释放Slab占用的cache内存空间(参考drop_caches的官方文档):

Writing to this will cause the kernel to drop clean caches, dentries and inodes from memory, causing that memory to become free.
To free pagecache:
* echo 1 > /proc/sys/vm/drop_caches
To free dentries and inodes:
* echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:
* echo 3 > /proc/sys/vm/drop_caches
As this is a non-destructive operation, and dirty objects are notfreeable, the user should run "sync" first in order to make sure allcached objects are freed.
This tunable was added in 2.6.16.

写了个脚本,定时清理内存(生产环境禁用)
vi freemem.sh

#!/bin/bash
sync
echo 3 > /proc/sys/vm/drop_caches

编辑定时任务
crontab -e

0 */6 * * * /home/script/freemem.sh

以下摘自网络

实际项目中告诉我们,如果因为是应用有像内存泄露、溢出的问题,从swap的使用情况是可以比较快速可以判断的,但free上面反而比较难查看。相反,如果在这个时候,我们告诉用户,修改系统的一个值,“可以”释放内存,free就大了。用户会怎么想?不会觉得操作系统“有问题”吗?所以说,我觉得既然核心是可以快速清空buffer或cache,也不难做到(这从上面的操作中可以明显看到),但核心并没有这样做(默认值是0),我们就不应该随便去改变它。一般情况下,应用在系统上稳定运行了,free值也会保持在一个稳定值的,虽然看上去可能比较小。

当发生内存不足、应用获取不到可用内存、OOM错误等问题时,还是更应该去分析应用方面的原因,如用户量太大导致内存不足、发生应用内存溢出等情况,否则,清空buffer,强制腾出free的大小,可能只是把问题给暂时屏蔽了。

我觉得,排除内存不足的情况外,除非是在软件开发阶段,需要临时清掉buffer,以判断应用的内存使用情况;或应用已经不再提供支持,即使应用对内存的时候确实有问题,而且无法避免的情况下,才考虑定时清空buffer。(可惜,这样的应用通常都是运行在老的操作系统版本上,上面的操作也解决不了)。而生产环境下的服务器可以不考虑手工释放内存,这样会带来更多的问题。记住内存是拿来用的,不是拿来看的。不像windows。

无论你的真实物理内存有多少,他都要拿硬盘交换文件来读。这也就是windows为什么常常提示虚拟空间不足的原因,你们想想多无聊,在内存还有大部分的时候,拿出一部分硬盘空间来充当内存。硬盘怎么会快过内存,所以我们看linux,只要不用swap的交换空间,就不用担心自己的内存太少。如果常常swap用很多,可能你就要考虑加物理内存了,这也是linux看内存是否够用的标准哦。当然这仅代表我个人意见,也欢迎大家来交流讨论。

qrcode_for_gh_bf7a27ade681_258.jpg

作者: 小柒

出处: https://blog.52itstyle.com

分享是快乐的,也见证了个人成长历程,文章大多都是工作经验总结以及平时学习积累,基于自身认知不足之处在所难免,也请大家指正,共同进步。

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 如有问题, 可邮件(345849402@qq.com)咨询。