记录-服务器内存过小导致出错
本文于2020年11月28日由AlvinCR更新
文章导引
出现问题:
这几天网站连续崩溃好几次,原因是Mysql占用内存过高,1GB内存,Mysql就能吃掉600M,导致mysql一直被后台kill,网站就登不上了…,去买新VPS,结果那边充值系统异常,钱又退回来了,无法新建实例,现在只能对这个服务器进行优化设置了。
顺便吐槽网上很多没用的教程,转载出来的东西自己都不看的….还要说明以下内容是我参考各种文章,自己总结出来的,不一定正确,如果发现设置完异常,请告诉我,我将会更改文章。
解决方法:
解决方法1:添加虚拟内存
Linux操作系统有两种实现虚拟内存的方法:交换分区(swap分区)和交换文件(swap文件)。
采用交换分区的办法其实就是新建一个分区,然后将该分区挂载作为交换空间,方法步骤与传统的新建分区一样。只不过格式化分区和挂载分区分别采用mkswap和swapon命令。在创建分区之前,我们常常要用过fdisk -l和df -Th命令来查看硬盘信息和挂载信息,来确定分区的大小。
(1)添加虚拟内存
使用free -h 查看剩余内存,这里可以看到我这里剩余内存惨不忍睹…
dd if=/dev/zero of=/mnt/swapfile bs=1M count=4096 if表示input_file输入文件,of表示output_file输出文件,bs表示block_size块大小,count表示计数。 4096可以改成任意的数值,因为这里bs设置是1M,因此4096就是4096M即4G。 添加完成后使用free -h 发现swap没有变化是怎么回事呢?这是因为我们还没有挂载新添加的目录
(2)挂载内存
格式化交换文件:
mkswap /mnt/swapfile
挂载交换文件:
swapon /mnt/swqpfile
使用上面命令之后,查看剩余内存就增加了4G,变成了5G
解决方法2:修改Mysql配置
(1)关闭performance_schema
只需要找到my.cnf参数,在sysqld下面添加performance_schema = off即可,该参数主要用于收集服务器性能参数,如果关闭出现BUG,请删除这一行。
(2)修改mysqldump
修改my.cnf参数,由于我的mysql默认配置就比较低,这里我就只改了mysqldump的大小,由原来的500M改成了300M
mysqldump是mysql用于转存储数据库的实用程序。它主要产生一个SQL脚本,其中包含从头重新创建数据库所必需的命令CREATE TABLE INSERT等。
完成操作后一定要重启Mysql
解决方法3:升级Mysql
从5.6版本升到5.8。由于我这里用的是宝塔管理,升级可能会出现异常,就没升级,下面是升级命令
yum update mysql-server
解决方法4:关闭Mysql非重要程序(建议不要使用)
建议不要使用,配置起来比较麻烦,可能会出现BUG,最重要的是升级mysql就能直接解决这个问题,这里仅提供这种方法的可能性用于参考。
要关闭 Performance Schema ,5.6默认开启的,该参数主要用于收集服务器性能参数。5.6版本以后默认开启,占用内存过高可以关闭。在 MySQL 配置文件的 [mysqld] 字段添加一句 performance_schema = off
重启mysql,内存占用大约是40M。
MySQL 的Performance Schema由来已久,但由于内存消耗,性能影响等原因,导致其始终无法进入主流的MySQL默认配置,对MySQL的问题诊断以及处理造成很多不利的影响。
一般而言,Performance Schema会对性能造成影响,比如row mutex的位置。实际上,MySQL经常出现问题的地方,很多时候是在Server层,在这一层,很多Performance Schema的设置并不会导致性能的下降(或者明显下降)。
PS相关的variable performance_schema不是动态的,默认是打开的;从5.7.8开始,即使PS是关闭的,其中
global_variables
,session_variables
,global_status
,session_status
这些表还是会生产数据,目的是为了show variable和show status可以从这些表中获取数据。PS包括很多variable用于限制PS,比如performance_schema_max_mutex_classes默认200,如果创建超过200的instrumented mutex instance,则不能继续创建。如果引发这种限制之后会增加相应的status,比如上面例子会增加
Performance_schema_mutex_instances_lost
。PS包括非常多的可以自定义限制条件的variable,也包括了很多对应status,可以通过下面语句查看。
SHOW STATUS LIKE 'perf%'; SHOW global variables LIKE 'perf%';
参考及引用:
https://rj03hou.github.io/mysql/MySQL-Performance-Schema%E5%92%8Csys-schema%E4%BB%8B%E7%BB%8D/
https://www.jianshu.com/p/711c1c7bce4c
https://zhidao.baidu.com/question/2144010258029989908.html