Apache2 [emerg] (28)No space left on device 10 June 2010

Kiedy restartujesz Apache, może się zdarzyć, że nie wstanie, mimo iż na konsoli dostaniesz komunikat, że wszystko jest OK. Jeśli zauważysz w error.log-u błąd typu [emerg](28)No space left on device: Couldn’t create accept lock to masz dwa wyjścia: sprawdzić, czy rzeczywiście nie brakuje już miejsca na dysku (df -h), albo … przeglądnij output strace, aby poznać szczegóły:

# tail -10 f /var/log/apache2/error.log
[Fri Feb 05 13:29:49 2010] [emerg] (28)No space left on device: Couldn’t create accept lock

strace of this process shows:

# strace -f /etc/init.d/apache2 restart

[…]
[pid 26787] fcntl64(15, F_GETFD) = 0x1 (flags FD_CLOEXEC)
[pid 26787] fcntl64(15, F_SETFD, FD_CLOEXEC) = 0
[pid 26787] ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbff2b568) = -1 ENOTTY (Inappropriate ioctl for device)
[pid 26787] _llseek(0, 0, [0], SEEK_CUR) = 0
[pid 26787] ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbff2b568) = -1 ENOTTY (Inappropriate ioctl for device)
[pid 26787] _llseek(1, 0, [0], SEEK_CUR) = 0
[pid 26787] ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbff2b568) = -1 ENOTTY (Inappropriate ioctl for device)
[pid 26787] _llseek(2, 0, [47419], SEEK_CUR) = 0
[pid 26787] ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbff2b568) = -1 ENOTTY (Inappropriate ioctl for device)
[pid 26787] _llseek(0, 0, [0], SEEK_CUR) = 0
[pid 26787] ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbff2b568) = -1 ENOTTY (Inappropriate ioctl for device)
[pid 26787] _llseek(1, 0, [0], SEEK_CUR) = 0
[pid 26787] ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbff2b568) = -1 ENOTTY (Inappropriate ioctl for device)
[pid 26787] _llseek(2, 0, [47419], SEEK_CUR) = 0
[pid 26787] ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbff2b568) = -1 ENOTTY (Inappropriate ioctl for device)
[pid 26787] _llseek(0, 0, [0], SEEK_CUR) = 0
[pid 26787] ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbff2b568) = -1 ENOTTY (Inappropriate ioctl for device)
[pid 26787] _llseek(1, 0, [0], SEEK_CUR) = 0
[pid 26787] ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbff2b568) = -1 ENOTTY (Inappropriate ioctl for device)
[pid 26787] _llseek(2, 0, [47419], SEEK_CUR) = 0
[pid 26787] stat64(“/var/log/apache2/httpd.pid”, {st_mode=S_IFREG|0640, st_size=6, …}) = 0
[pid 26787] gettimeofday({1265372989, 308944}, NULL) = 0
[pid 26787] write(2, “[Fri Feb 05 13:29:49 2010] [warn]”…, 139) = 139
[pid 26787] open(“/var/log/apache2/httpd.pid”, O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE|O_CLOEXEC, 0644) = 16
[pid 26787] fcntl64(16, F_GETFD) = 0x1 (flags FD_CLOEXEC)
[pid 26787] fcntl64(16, F_SETFD, FD_CLOEXEC) = 0
[pid 26787] write(16, “26787\n”…, 6) = 6
[pid 26787] close(16) = 0
[pid 26787] semget(IPC_PRIVATE, 1, IPC_CREAT|0600) = -1 ENOSPC (No space left on device)
[pid 26787] gettimeofday({1265372989, 315808}, NULL) = 0

Widać wyraźnie, że z brakiem miejsca to nie ma nic wspólnego, za to z semaforami już więcej zatem albo je zredukujemy albo wyczyścimy całkowicie dla danego użytkownika. Ja preferuję opcję 2.

USER=`cat /etc/apache2/apache2.conf |grep User|grep -v LogF|awk '{print $2}'`
for sem in `ipcs -s |grep ${USER:0:5}| awk '{print $2}'`; do
    ipcrm -s ${sem}
done

Natępnie musimy nieco poprawić system. Dla Linux Debian:

# echo -e "\n\n# tuning of semaphores (apache related issues with no space left on device)\nkernel.msgmni = 1024\nkernel.sem = 250 256000 32 1024" >> /etc/sysctl.conf

a następnie wymusić przez system odczytanie nowych wartości:

# sysctl -p

No i załatwione.

Tagi: , , , ,

Zostaw odpowiedź