历史记录,  更新完成,  网站搭建

记录-服务器内存过小导致出错

本文于2020年11月28日由AlvinCR更新

出现问题:

这几天网站连续崩溃好几次,原因是Mysql占用内存过高,1GB内存,Mysql就能吃掉600M,导致mysql一直被后台kill,网站就登不上了…,去买新VPS,结果那边充值系统异常,钱又退回来了,无法新建实例,现在只能对这个服务器进行优化设置了。

顺便吐槽网上很多没用的教程,转载出来的东西自己都不看的….还要说明以下内容是我参考各种文章,自己总结出来的,不一定正确,如果发现设置完异常,请告诉我,我将会更改文章。

 

 

解决方法:

解决方法1:添加虚拟内存

Linux操作系统有两种实现虚拟内存的方法:交换分区(swap分区)交换文件(swap文件)

采用交换分区的办法其实就是新建一个分区,然后将该分区挂载作为交换空间,方法步骤与传统的新建分区一样。只不过格式化分区和挂载分区分别采用mkswapswapon命令。在创建分区之前,我们常常要用过fdisk -ldf -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_variablessession_variablesglobal_statussession_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%';

 

 

参考及引用:

Linux下如何添加虚拟内存

MySQL Performance schema设置的一些建议选项

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

 

 

 

Leave a Reply

邮箱地址不会被公开。 必填项已用*标注