mysqld服务,每天一次停止EC2服务器上(mysqld service stops once a

2019-06-27 08:49发布

环境详细信息:

Server: Amazon ec2 Linux
Web Server: Apache
Web Framework: Django with mod_wsgi

下面笔者在mysql_err.log文件发现。

The InnoDB memory heap is disabled
120823  3:21:40 InnoDB: Mutexes and rw_locks use GCC atomic builtins
120823  3:21:40 InnoDB: Compressed tables use zlib 1.2.3
120823  3:21:40 InnoDB: Using Linux native AIO
120823  3:21:41 InnoDB: Initializing buffer pool, size = 128.0M
InnoDB: mmap(137363456 bytes) failed; errno 12
120823  3:21:41 InnoDB: Completed initialization of buffer pool
120823  3:21:41 InnoDB: Fatal error: cannot allocate memory for the buffer pool
120823  3:21:41 [ERROR] Plugin 'InnoDB' init function returned error.
120823  3:21:41 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
120823  3:21:41 [ERROR] Unknown/unsupported storage engine: InnoDB
120823  3:21:41 [ERROR] Aborting

貌似系统内存不足以分配内存缓冲池。 当我使用发生同样的错误Amazon ec2 micro instance ,所以,我搬到了small instance 。 它正常工作了一些日子,但现在它是在一天再次破一次。 是否有一个永久性的修复? 我可以移动到中等实例,但问题是这是否固定或不呢? 我应该减少innodb_buffer_pool_size ,什么是首选大小?

结果cat /proc/meminfo的以下(可能它会帮助):

MemTotal:        1697824 kB
MemFree:          125744 kB
Buffers:          109704 kB
Cached:           481408 kB
SwapCached:            0 kB
Active:          1212396 kB
Inactive:         266840 kB
Active(anon):     888192 kB
Inactive(anon):       76 kB
Active(file):     324204 kB
Inactive(file):   266764 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 4 kB
Writeback:             0 kB
AnonPages:        888144 kB
Mapped:            15604 kB
Shmem:               144 kB
Slab:              63752 kB
SReclaimable:      53680 kB
SUnreclaim:        10072 kB
KernelStack:         800 kB
PageTables:        16436 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:      848912 kB
Committed_AS:    1417140 kB
VmallocTotal:   34359738367 kB
VmallocUsed:       10988 kB
VmallocChunk:   34359725168 kB
DirectMap4k:     1748992 kB
DirectMap2M:           0 kB

操作系统版本信息(uname -a): Linux ip-10-246-134-149 3.2.21-1.32.6.amzn1.x86_64 #1 SMP Sat Jun 23 02:32:15 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

我检查了ps aux命令磨服务器有类似的内存只有15MB左右,这些都是httpd当时正在运行的进程:

结果free -m

total       used       free     shared    buffers     cached
Mem:          1657       1628         29          0          3         19
-/+ buffers/cache:       1605         51
Swap:          895        875         20

结果ps aux

apache   21123  0.1  1.2 394652 20464 ?        S    19:35   0:06 /usr/sbin/httpd
apache   21146  0.1  1.2 394280 20796 ?        S    19:38   0:06 /usr/sbin/httpd
apache   21152  0.1  1.2 394284 21560 ?        S    19:38   0:05 /usr/sbin/httpd
apache   21155  0.2  1.4 396244 24528 ?        S    19:38   0:06 /usr/sbin/httpd
apache   21156  0.1  1.1 392552 20344 ?        S    19:38   0:06 /usr/sbin/httpd
apache   21157  0.1  1.1 394284 18884 ?        S    19:38   0:05 /usr/sbin/httpd
apache   21159  0.1  1.4 396200 25040 ?        S    19:38   0:06 /usr/sbin/httpd
apache   21161  0.1  1.2 394856 21724 ?        S    19:38   0:06 /usr/sbin/httpd
apache   21162  0.1  1.3 394864 22400 ?        S    19:38   0:06 /usr/sbin/httpd
apache   21163  0.1  1.3 394860 22204 ?        S    19:38   0:06 /usr/sbin/httpd
apache   21164  0.1  1.1 392560 19204 ?        S    19:38   0:06 /usr/sbin/httpd
apache   21165  0.1  1.3 394832 22280 ?        S    19:38   0:06 /usr/sbin/httpd
apache   21166  0.1  1.3 395276 22932 ?        S    19:38   0:06 /usr/sbin/httpd
apache   21172  0.2  1.4 396320 24820 ?        S    19:38   0:06 /usr/sbin/httpd
apache   21174  0.2  1.7 400672 29452 ?        S    19:39   0:06 /usr/sbin/httpd
apache   21178  0.1  1.4 400540 25304 ?        S    19:39   0:06 /usr/sbin/httpd
apache   21179  0.2  1.6 400580 27856 ?        S    19:39   0:06 /usr/sbin/httpd
apache   21184  0.1  1.7 400628 29320 ?        S    19:39   0:06 /usr/sbin/httpd
apache   21185  0.1  1.6 397944 27292 ?        S    19:39   0:05 /usr/sbin/httpd
apache   21186  0.1  1.5 397960 25648 ?        S    19:39   0:05 /usr/sbin/httpd
apache   21187  0.1  1.7 400576 29120 ?        S    19:39   0:06 /usr/sbin/httpd
apache   21191  0.1  1.4 400576 24400 ?        S    19:39   0:06 /usr/sbin/httpd
apache   21193  0.1  1.4 400536 24940 ?        S    19:39   0:05 /usr/sbin/httpd
apache   21194  0.1  1.5 400572 26096 ?        S    19:39   0:06 /usr/sbin/httpd
apache   21203  0.1  1.6 400580 28808 ?        S    19:39   0:05 /usr/sbin/httpd
apache   21206  0.1  1.7 400584 29732 ?        S    19:39   0:06 /usr/sbin/httpd
apache   21207  0.1  1.6 400576 27940 ?        S    19:39   0:06 /usr/sbin/httpd
apache   21224  0.1  1.2 400624 20768 ?        S    19:39   0:06 /usr/sbin/httpd
apache   21225  0.1  1.6 400576 28468 ?        S    19:39   0:05 /usr/sbin/httpd
apache   21226  0.1  1.6 400576 28048 ?        S    19:39   0:06 /usr/sbin/httpd
apache   21228  0.1  1.4 400572 23880 ?        S    19:39   0:06 /usr/sbin/httpd
apache   21237  0.1  1.5 400628 26124 ?        S    19:39   0:06 /usr/sbin/httpd
apache   21265  0.1  1.6 400536 28592 ?        S    19:39   0:06 /usr/sbin/httpd
apache   21276  0.1  1.2 400544 21456 ?        S    19:39   0:05 /usr/sbin/httpd
apache   21277  0.1  1.3 400624 22676 ?        S    19:39   0:05 /usr/sbin/httpd
apache   21278  0.1  1.6 400536 27360 ?        S    19:39   0:06 /usr/sbin/httpd
apache   21282  0.1  1.4 400612 24996 ?        S    19:39   0:06 /usr/sbin/httpd
apache   21292  0.1  1.4 400532 24780 ?        S    19:39   0:05 /usr/sbin/httpd
apache   21302  0.2  1.2 400540 21332 ?        S    19:39   0:06 /usr/sbin/httpd
apache   21303  0.1  1.3 400628 22228 ?        S    19:39   0:06 /usr/sbin/httpd
apache   21305  0.2  1.2 400536 21116 ?        S    19:39   0:06 /usr/sbin/httpd
apache   21306  0.1  1.3 400572 22380 ?        S    19:39   0:06 /usr/sbin/httpd
apache   21307  0.1  1.1 397956 20056 ?        S    19:39   0:05 /usr/sbin/httpd
apache   21308  0.1  1.2 400624 21520 ?        S    19:39   0:06 /usr/sbin/httpd
apache   21319  0.1  1.1 400540 19468 ?        S    19:39   0:05 /usr/sbin/httpd
apache   21320  0.1  1.3 400628 22712 ?        S    19:39   0:05 /usr/sbin/httpd
apache   21335  0.1  1.0 400540 17236 ?        S    19:39   0:05 /usr/sbin/httpd
apache   21336  0.1  1.3 400628 22188 ?        S    19:39   0:06 /usr/sbin/httpd
apache   21352  0.1  1.1 394276 18972 ?        S    19:40   0:04 /usr/sbin/httpd
apache   21356  0.1  1.1 394280 19028 ?        S    19:40   0:05 /usr/sbin/httpd
apache   21358  0.1  1.1 394280 19004 ?        S    19:40   0:05 /usr/sbin/httpd
apache   21361  0.2  0.7 400452 12632 ?        S    19:40   0:06 /usr/sbin/httpd
apache   21610  0.2  1.6 400536 27660 ?        S    19:46   0:06 /usr/sbin/httpd
apache   21643  0.2  1.3 400156 23272 ?        S    19:55   0:04 /usr/sbin/httpd
apache   21647  0.2  1.0 400544 17556 ?        S    19:57   0:05 /usr/sbin/httpd
apache   21654  0.2  1.5 400188 26884 ?        S    19:58   0:05 /usr/sbin/httpd
apache   21719  0.3  1.9 400192 32264 ?        S    20:14   0:03 /usr/sbin/httpd
apache   21725  0.2  2.0 400044 35340 ?        S    20:15   0:03 /usr/sbin/httpd
apache   21738  0.0  0.8 257648 13792 ?        S    20:26   0:00 /usr/sbin/httpd

可以在任何一个人有一个关于它的想法,为什么有这么多httpd进程?

Answer 1:

使用可用RAM的50%进行测试:

您可以减少innodb_buffer_pool_size很低,看它是否帮助:

#/etc/my.cnf 
innodb_buffer_pool_size = 1M

经验法则是innodb_buffer_pool_size设置为可用内存的50%,你的低内存的测试。 这意味着你开始除了 MySQL的InnoDB的服务器和一切。 看你有多少RAM。 然后,使用的是50%的InnoDB。

要一次尝试了很多低内存设置:

  • http://paragasu.wordpress.com/2008/12/02/very-low-memory-mysql-5-mycnf-configuration/

更可能的罪魁祸首是任何其他的服务器上,如web服务器。

Apache的?

您是否使用Apache和/或其他Web服务器? 如果是的话,尽量降低其RAM的使用。 例如在Apache中的conf,考虑这样的低内存设置:

StartServers 1
MinSpareServers 1
MaxSpareServers 5
MaxClients 5

和CAP这样的要求:

MaxRequestsPerChild 300

然后重新启动Apache。

mod_wsgi的:

如果你使用Apache mod_python的有,切换到Apache与mod_wsgi的。

Pympler:

如果问题仍然发生,可能是你的Django正在稳步增长。 试着用Pympler Django的内存分析:

  • http://www.rkblog.rk.edu.pl/w/p/profiling-django-object-size-and-memory-usage-pympler/

SAR:

你曾经每一天的故障,那么一旦每星期故障,报告可能指向某种cron作业的每天或每周运行。 比如,也许有一个批次的过程,占用了大量的内存,或者数据库转储等。

要跟踪内存使用和MySQL中死亡前一小时寻找RAM尖峰,看看特区,这是一个伟大的工具: http://www.thegeekstuff.com/2011/03/sar-examples/



Answer 2:

你必须减少你innodb_buffer_pool_size = <60-80的主内存%)

解决方案Innodb的错误:

110603  7:34:15 [ERROR] Plugin ‘InnoDB’ init function returned error.
110603  7:34:15 [ERROR] Plugin ‘InnoDB’ registration as a STORAGE ENGINE failed.
110603  7:34:15 [ERROR] Unknown/unsupported storage engine: InnoDB
110603  7:34:15 [ERROR] Aborting

10603  7:34:15 [Note] /usr/sbin/mysqld: Shutdown complete

I moved the ib_logfile0 and ib_logfile01 to bak and start Mysql again. Now this time, it is working fine

[root@xxx mysql]# mv ib_logfile0 ib_logfile0-bak
[root@xxx mysql]# mv ib_logfile1 ib_logfile1-bak

来源: http://www.onaxer.com/tag/error-plugin-innodb-init-function-returned-error/



Answer 3:

像其他人所说的,这个问题似乎是您系统上的RAM运行低和MySQL被炸毁了,由于这一点。 下面是如何去缩小正在使用您的系统内存是在哪里以及如何恢复从数据库中去了。

看看collectd及其插件。 一些适用的人可能是流程插件和存储插件 。 有了这些,你可以看到你的系统内存使用和哪些进程占用了大部分。

根据您是如何运行的Django,您可以配置工作进程只处理一定数量的请求,然后终止。 这样,如果有某种在你的应用程序的内存泄漏也不会坚持过去那种数量的请求。 例如,如果你使用Gunicorn ,您可以使用--max-请求选项。 它已处理500个请求后,将其设置为500将下降工人。

上述与统计信息收集相结合,将告诉你一些有趣的内存使用量的趋势。

至于数据库下去的时候,你可以在安装过程监督,使如果MySQL确实死了,它会自动重新启动。 在MySQL的Ubuntu最新版本使用暴发户做到这一点。 如果进程中止,新贵将使其立即备份。 如果你使用其他发行版不具有此内置,看看监事 。 虽然这并没有解决问题,将至少减轻其影响。 这不应该被看作是修复,而是一个方式,让您的应用程序的情况下运行的东西不出差错。



Answer 4:

有一次,我陷入了类似的问题,我真的很沮丧,我的用户看到这个丑陋的消息错误建立DB连接 。 相反,解决具体问题,我发现这个回购就像是我(暂时)魅力的工作。 之后,我被我的朋友调试它,他只是微调我的服务器的一些配置更改。 但我还是添加了这个剧本到我的crontab每10分钟,然后检查服务器崩溃(这对于我的情况下,最终坠毁每当我在我的服务器上运行的vncserver),然后重新启动



Answer 5:

通过增加新的交换空间也可能有助于增加可用的RAM。 步骤是在这里

请确保您所创建的尺寸比所显示的可用空间小的/交换文件

df -h

例如,对于我DF-H的输出是:

Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      7.8G  1.2G  6.3G  16% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
udev            492M   12K  492M   1% /dev
tmpfs           100M  336K   99M   1% /run

因此,我创建使用2 G

sudo fallocate -l 2G /swapfile

然后只需启动该服务

sudo /etc/init.d/mysql restart

希望这可以帮助。 祝一切顺利。



Answer 6:

我找到答案的讨论增加了,对我的工作: https://www.digitalocean.com/community/questions/mysql-server-keeps-stopping-unexpectedly?answer=26016

你必须做两innodb_buffer_pool_size以合理的东西像32M my.conf/etc/mysql/my.cnf ,你也可能需要修改/etc/apache2/mods-enabled/mpm_prefork.conf减少连接数通过Apache的开始;

<IfModule mpm_prefork_module>
    StartServers     3
    MinSpareServers  3
    MaxSpareServers  5
    MaxRequestWorkers 25
    MaxConnectionsPerChild  0
</IfModule>


文章来源: mysqld service stops once a day on ec2 server