Назад | Перейти на главную страницу

Инстанс Amazon EC2 - m1.medium Ubuntu 12.04 - три дня назад вылетал

Среда:

Amazon EC2 Instance - m1.medium
Ubuntu 12.04
Apache 2.2.22 - Running a Drupal Site
Using MySQL DB Server

RAM info:

~$ free -gt
         total       used       free     shared    buffers     cached
Mem:             3          1          2          0          0          0
-/+ buffers/cache:          0          2
Swap:            0          0          0
Total:           3          1          2

Hard drive info:

Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      7.9G  4.7G  2.9G  62% /
udev            1.9G  8.0K  1.9G   1% /dev
tmpfs           751M  180K  750M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            1.9G     0  1.9G   0% /run/shm
/dev/xvdb       394G  199M  374G   1% /mnt

Эта проблема

Примерно два дня назад сайт начал давать сбой, потому что сервер MySQL был отключен Apache со следующим сообщением:

kernel: [2963685.664359] [31716]   106 31716   226946    22748   0
        0             0 mysqld
kernel: [2963685.664730] Out of memory: Kill process 31716 (mysqld) 
        score 23 or sacrifice child
kernel: [2963685.664764] Killed process 31716 (mysqld) 
        total-vm:907784kB, anon-rss:90992kB, file-rss:0kB
kernel: [2963686.153608] init: mysql main process (31716)
        killed by KILL signal
kernel: [2963686.169294] init: mysql main process ended, respawning

Это говорит о том, что виртуальная машина занимала 0,9 ГБ, но у моего Ram 2 ГБ свободно, поэтому 1 ГБ все еще оставалось свободным. Я понимаю, что в приложениях Linux можно выделить больше памяти, чем доступно физически. Я не знаю, проблема ли в этом, это впервые. Очевидно, сервер MySQL пытается перезагрузиться, но для него явно нет памяти и он не перезапускается. Вот его журнал ошибок:

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

[Note] /usr/sbin/mysqld: Shutdown complete

Я просто перезапустил сервис Mysql. Примерно через два часа это случилось снова. Я перезапустил его. Затем это случилось снова через 9 часов. Затем я подумал о параметре MaxClients в apache.conf и пошел его проверить. Было установлено 150. Я решил понизить до 60. Вот так:

<IfModule mpm_prefork_module>
    ...
    MaxClients            60
</IfModule>

<IfModule mpm_worker_module>
    ...
    MaxClients            60
</IfModule>

<IfModule mpm_event_module>
    ...
    MaxClients           60
</IfModule>

Как только я это сделал, я перезапустил службу apache2, и все прошло гладко в течение 3/4 дня. Так как ночью служба MySQL снова отключилась, но на этот раз ее не остановила служба Apache2. Вместо этого он вызвал OOM-Killer со следующим сообщением:

kernel: [3104680.005312] mysqld invoked oom-killer: gfp_mask=0x201da, order=0, 
                         oom_adj=0, oom_score_adj=0
kernel: [3104680.005351]  [<ffffffff81119795>] oom_kill_process+0x85/0xb0
kernel: [3104680.548860] init: mysql main process (30821) killed by KILL signal

Теперь у меня нет идей. В некоторых статьях говорится, что в идеале нужно изменить поведение ядра следующим образом (включить его в файл /etc/sysctl.conf)

vm.overcommit_memory = 2
vm.overcommit_ratio = 80

Так что никаких переборов не произойдет. Мне интересно, можно ли это сделать? Имейте в виду, что я не администратор сервера, у меня есть базовые знания.

Заранее большое спасибо.