Django 部署中的踩天坑 MySQL 占用内存过高
接近2周没记录任何文章,是因为我在这个期间踩了天坑,整整2个礼拜没找到问题,虽然最后结论很简单是优化了MySQL,但是这个过程真的让人吐血。
故事开端:
如上一篇文章,我部署在腾讯云上面
腾讯云配置:1C1G5M
Django: 2.1
MySQL: 8.0
其他相关的包:
Supervisor + Gunicorn + Celery
一开始我只是用supervisor运行了Gunicorn来启动Django项目,运行良好。
然后我在supervisor的配置中加入了celery这个program,噩梦就开始了。
访问我的主页,突然就502报错了,回到服务器端,输入mysql,结果发现竟然报错找不到sock文件?!?!
can't connect to mysql server through socket /var/run/mysqld/mysqld.sock
一头的雾水....google了一大圈,有的说要重装,有的说要改配置文件,最后我直接重启了服务器,发现mysql又可以访问了?
接着继续尝试运行supervisor,同时Django项目和Celery,访问主页,mysql又挂了?!?!
这下开始仔细找问题了,然后发现,只要在同时运行了Django和Celery之后,/var/run/mysqld
这个文件夹,就整个消失(被删除了??)脑袋都炸了
然后继续通过/var/log/mysql/error.log
里面的日志找问题
终于看到如下信息
emmmm....看上去像是和内存有关系的信息?搜了一大圈
原来是和innodb_buffer_pool_size
有关系的,默认是128MB,不过我的服务器内存才1G....会不会是因为这个呢?死马当活马医,去修改这个配置,我改成了8M.
文件在 /etc/mysql/mysql.conf.d/mysqld.cnf
我心想着,改成8M总行了吧,最低要求也是5M.....
结果是太天真了。
重新启动mysql后,测试,一样没用....
但是故障不一样了,他不会发生/var/run/mysqld文件夹被删除的情况了
不过依旧无法访问主页,报错500.
这下是彻底懵了,我想mysql这里应该不存在问题了,那问题在哪呢?
于是我在Django的settings.py里面设置了logging部分,想要看看到底这个500来自于哪里?
下面是相关报错的信息。
Pymysql报错
看了开头,他竟然报的是pymysql/connetions.py的错误...
可问题是我没有额外需要用到pymysql和mysql的地方啊。。。
celery里面的broker和backend我都是连的redis...哪里来的通过pymysql链接MYSQL??
而且我只运行Django的话,连接数据库读取是没问题的,说明肯定不是连接的问题.....
网上又搜了几天,今天突然想到,出问题的时候,服务器会变得非常卡顿,在命令行输入命令都会有问题,会不会是CPU或者内存占比太高了?
输入top一看,mysql占了40%+,celery占了15%左右。
可能问题出在mysql上?去搜了一下关于mysql占内存太高的信息,有筒子说是因为mysql的performance_schema=ON
被打开了,占用了相当一大部分的内存.
在mysql看一下这个参数的情况,果然是打开的状态
on.jpg
尝试关闭,还是在mysql的配置文件里面进行修改
关闭Performance_schema
重启mysql,命令行输入top看一下内存占比。
mysql占比
然后,最终的尝试
sudo supervisorctl start all
终于正常运行了,网站丝滑般流畅................
整了2个礼拜的问题,总算解决掉了.............