Проблема возникла когда я попытался загрузить модуль mod_owa.so для apache (он используется для соедининения с Oracle и восстановления информации). Всякий раз система показывала высокую активность (как только запускался apache) и появлялись defunct-процессы (defunct процесс (зомби) - процесс-потомок (дочерний процесс), котрый завершился раньше, чем этого ожидал процесс-родитель):
{callacct:/u01/app/oracle} /usr/apache/bin/apachectl start
/usr/apache/bin/apachectl start: httpd started
{callacct:/u01/app/oracle} vmstat 1
kthr memory page disk faults cpu
r b w swap free re mf pi po fr de sr m1 m1 m1 m2 in sy cs us sy id
0 0 0 17075280 447352 89 105 14 6 6 0 2 1 1 1 0 432 2566 671 1 1 98
0 0 0 16958384 157736 326 1242 23 31 31 0 0 40 43 43 0 2319 670 409 1 7 92
0 0 0 16945808 154256 93 1962 24 0 0 0 0 110 113 111 0 4168 1224 736 2 14 83
0 0 0 16945720 149888 1 139 8 0 0 0 0 247 256 261 0 5067 64 716 0 10 90
0 0 0 16948864 151448 3 601 55 879 879 0 0 186 186 174 0 4885 77 637 0 9 91
^C
Система перед стартом apache показывала id 100. Раз он уменьшается до 90 и 80, что-то не так. Вывод ps -ef:
{callacct:/u01/app/oracle} ps -ef
UID PID PPID C STIME TTY TIME CMD
root 15038 14830 0 - ? 0:00
oracle 16343 16341 0 Sep 19 pts/3 0:00 -sh
oracle 16341 16338 0 Sep 19 ? 0:00 /usr/lib/ssh/sshd
root 15042 12675 0 Sep 19 ? 0:00 /usr/lib/ssh/sshd
root 15041 14830 1 09:14:45 ? 0:00 /usr/apache/bin/httpd
root 14830 1 0 09:11:06 ? 0:01 /usr/apache/bin/httpd
root 15044 15511 0 09:14:48 pts/2 0:00 ps -ef
root 15043 14830 1 09:14:45 ? 0:00 /usr/apache/bin/httpd
root 15040 14830 0 - ? 0:00
Появился defunct-процесс , и load прыгнуло от нуля до .22:
{callacct:/u01/app/oracle} w
9:13am up 4 day(s), 21:49, 3 users, load average: 0.22, 0.12, 0.05
Я начал с изучения исходников mod_owa.so и его перекомпиляции (сначала я загружал готовый бинарник), но это не принесло никаких результатов. После этого я решил наблюдать за системой, чтобы узнать, что-же фактически происходит.
Здесь я использую execsnoop от DTraceToolkit, чтобы обнаружить что-нибудь очевидное: execsnoop - скрипт DTrace, который показывает запускаемые в системе файлы:
{callacct:/root/DTraceToolkit-0.83} ./execsnoop -a
TIME STRTIME ZONE PROJ UID PID PPID ARGS
[wait 10-15 seconds]
^C
Вообще никаких результатов. Тогда попробуем opensnoop: opensnoop - скрипт DTrace, динамически показывающий открытые в системе файлы:
{callacct:/root/DTraceToolkit-0.83} ./opensnoop -a
TIME STRTIME UID PID FD ERR PATH ARGS
425004142906 2005 Sep 21 09:27:27 0 15268 3 0 /etc/default/nss /usr/apache/bin/httpd\0
425004143217 2005 Sep 21 09:27:27 0 15268 3 0 /etc/nsswitch.conf /usr/apache/bin/httpd\0
425004144087 2005 Sep 21 09:27:27 0 15268 3 0 /usr/lib/nss_files.so.1 /usr/apache/bin/httpd\0
425004146092 2005 Sep 21 09:27:27 0 15268 3 0 /etc/group /usr/apache/bin/httpd\0
425004146403 2005 Sep 21 09:27:27 0 15268 3 0 /usr/lib/nss_ldap.so.1 /usr/apache/bin/httpd\0
425004146681 2005 Sep 21 09:27:27 0 15268 3 0 /usr/lib/libsldap.so.1 /usr/apache/bin/httpd\0
425004147142 2005 Sep 21 09:27:27 0 15268 3 0 /usr/lib/libldap.so.5 /usr/apache/bin/httpd\0
425004147924 2005 Sep 21 09:27:27 0 15268 3 0 /usr/lib/libsasl.so.1 /usr/apache/bin/httpd\0
425004148358 2005 Sep 21 09:27:27 0 15268 3 0 /usr/lib/mps/libnspr4.so /usr/apache/bin/httpd\0
425004148667 2005 Sep 21 09:27:27 0 15268 3 0 /usr/lib/mps/libplc4.so /usr/apache/bin/httpd\0
425004148876 2005 Sep 21 09:27:27 0 15268 3 0 /usr/lib/mps/libnss3.so /usr/apache/bin/httpd\0
425004149175 2005 Sep 21 09:27:27 0 15268 3 0 /usr/lib/mps/libssl3.so /usr/apache/bin/httpd\0
425004149507 2005 Sep 21 09:27:27 0 15268 3 0 /usr/lib/libthread.so.1 /usr/apache/bin/httpd\0
425004149871 2005 Sep 21 09:27:27 0 15268 3 0 /usr/lib/mps/libsoftokn3.so /usr/apache/bin/httpd\0
425004150274 2005 Sep 21 09:27:27 0 15268 3 0 /usr/lib/mps/libplds4.so /usr/apache/bin/httpd\0
425004151866 2005 Sep 21 09:27:27 0 15268 3 0 /usr/lib/mps/cpu/sparcv8plus/libnspr_flt4.so /usr/apache/bin/httpd\0
425004158239 2005 Sep 21 09:27:27 0 15268 3 0 /var/run/ldap_cache_door /usr/apache/bin/httpd\0
425004161287 2005 Sep 21 09:27:27 0 15268 -1 2 /u01/app/oracle/ocommon/nls/admin/data/lx1boot.nlb /usr/apache/bin/httpd\0
425005154629 2005 Sep 21 09:27:28 0 15270 3 0 /etc/default/nss /usr/apache/bin/httpd\0
425005154935 2005 Sep 21 09:27:28 0 15270 3 0 /etc/nsswitch.conf /usr/apache/bin/httpd\0
425005155827 2005 Sep 21 09:27:28 0 15270 3 0 /usr/lib/nss_files.so.1 /usr/apache/bin/httpd\0
425005157754 2005 Sep 21 09:27:28 0 15270 3 0 /etc/group /usr/apache/bin/httpd\0
425005158066 2005 Sep 21 09:27:28 0 15270 3 0 /usr/lib/nss_ldap.so.1 /usr/apache/bin/httpd\0
425005158365 2005 Sep 21 09:27:28 0 15270 3 0 /usr/lib/libsldap.so.1 /usr/apache/bin/httpd\0
425005158899 2005 Sep 21 09:27:28 0 15270 3 0 /usr/lib/libldap.so.5 /usr/apache/bin/httpd\0
425005159578 2005 Sep 21 09:27:28 0 15270 3 0 /usr/lib/libsasl.so.1 /usr/apache/bin/httpd\0
425005160012 2005 Sep 21 09:27:28 0 15270 3 0 /usr/lib/mps/libnspr4.so /usr/apache/bin/httpd\0
425005161877 2005 Sep 21 09:27:28 0 15270 3 0 /usr/lib/mps/libplc4.so /usr/apache/bin/httpd\0
425005162117 2005 Sep 21 09:27:28 0 15270 3 0 /usr/lib/mps/libnss3.so /usr/apache/bin/httpd\0
425005162434 2005 Sep 21 09:27:28 0 15270 3 0 /usr/lib/mps/libssl3.so /usr/apache/bin/httpd\0
425005162795 2005 Sep 21 09:27:28 0 15270 3 0 /usr/lib/libthread.so.1 /usr/apache/bin/httpd\0
425005163160 2005 Sep 21 09:27:28 0 15270 3 0 /usr/lib/mps/libsoftokn3.so /usr/apache/bin/httpd\0
425005163621 2005 Sep 21 09:27:28 0 15270 3 0 /usr/lib/mps/libplds4.so /usr/apache/bin/httpd\0
425005165246 2005 Sep 21 09:27:28 0 15270 3 0 /usr/lib/mps/cpu/sparcv8plus/libnspr_flt4.so /usr/apache/bin/httpd\0
425005173810 2005 Sep 21 09:27:28 0 15270 3 0 /var/run/ldap_cache_door /usr/apache/bin/httpd\0
425005176723 2005 Sep 21 09:27:28 0 15270 -1 2 /u01/app/oracle/ocommon/nls/admin/data/lx1boot.nlb /usr/apache/bin/httpd\0
425005152831 2005 Sep 21 09:27:28 0 15269 3 0 /etc/default/nss /usr/apache/bin/httpd\0
425005153135 2005 Sep 21 09:27:28 0 15269 3 0 /etc/nsswitch.conf /usr/apache/bin/httpd\0
425005154016 2005 Sep 21 09:27:28 0 15269 3 0 /usr/lib/nss_files.so.1 /usr/apache/bin/httpd\0
425005155926 2005 Sep 21 09:27:28 0 15269 3 0 /etc/group /usr/apache/bin/httpd\0
425005156238 2005 Sep 21 09:27:28 0 15269 3 0 /usr/lib/nss_ldap.so.1 /usr/apache/bin/httpd\0
425005156540 2005 Sep 21 09:27:28 0 15269 3 0 /usr/lib/libsldap.so.1 /usr/apache/bin/httpd\0
425005157045 2005 Sep 21 09:27:28 0 15269 3 0 /usr/lib/libldap.so.5 /usr/apache/bin/httpd\0
425005157713 2005 Sep 21 09:27:28 0 15269 3 0 /usr/lib/libsasl.so.1 /usr/apache/bin/httpd\0
425005158164 2005 Sep 21 09:27:28 0 15269 3 0 /usr/lib/mps/libnspr4.so /usr/apache/bin/httpd\0
425005158493 2005 Sep 21 09:27:28 0 15269 3 0 /usr/lib/mps/libplc4.so /usr/apache/bin/httpd\0
425005158708 2005 Sep 21 09:27:28 0 15269 3 0 /usr/lib/mps/libnss3.so /usr/apache/bin/httpd\0
425005159021 2005 Sep 21 09:27:28 0 15269 3 0 /usr/lib/mps/libssl3.so /usr/apache/bin/httpd\0
425005159381 2005 Sep 21 09:27:28 0 15269 3 0 /usr/lib/libthread.so.1 /usr/apache/bin/httpd\0
425005159749 2005 Sep 21 09:27:28 0 15269 3 0 /usr/lib/mps/libsoftokn3.so /usr/apache/bin/httpd\0
425005160265 2005 Sep 21 09:27:28 0 15269 3 0 /usr/lib/mps/libplds4.so /usr/apache/bin/httpd\0
425005162040 2005 Sep 21 09:27:28 0 15269 3 0 /usr/lib/mps/cpu/sparcv8plus/libnspr_flt4.so /usr/apache/bin/httpd\0
425005168873 2005 Sep 21 09:27:28 0 15269 3 0 /var/run/ldap_cache_door /usr/apache/bin/httpd\0
425005171924 2005 Sep 21 09:27:28 0 15269 -1 2 /u01/app/oracle/ocommon/nls/admin/data/lx1boot.nlb /usr/apache/bin/httpd\0
Видно, что процесс httpd открывает все эти файлы опять и опять. Что нас интересует здесь, так это - FD (дескриптор файла) с о значением '-1' (что означает ошибку) для файла '/u01/app/oracle/ocommon/nls/admin/data/lx1boot.nlb'. Я проверяю, сществует ли действительно этот файл:
{callacct:/u01/app/oracle} ls /u01/app/oracle/ocommon/nls/admin/data/lx1boot.nlb
/u01/app/oracle/ocommon/nls/admin/data/lx1boot.nlb: No such file or directory
Я нахожу этот файл в другом месте:
{callacct:/u01/app/oracle} find /u01 -name lx1boot.nlb
/u01/app/oracle/OraHome1/ocommon/nls/admin/data/lx1boot.nlb
Проблема в том, что программа ищет файл в /u01/app/oracle/ocommon вместо /u01/app/oracle/OraHome1/ocommon
Это лечится просто, создаю symlink на эту директорию:
{callacct:/u01/app/oracle} ln -s /u01/app/oracle/OraHome1/ocommon ocommon
{callacct:/u01/app/oracle} ls -al
total 16
drwxrwxr-x 6 oracle oinstall 512 Sep 21 09:46 .
drwx--x--x 3 oracle root 512 Sep 19 09:46 ..
-rwxr-xr-x 1 oracle oinstall 12 Sep 19 10:05 .login
drwxr-xr-x 28 oracle oinstall 512 Sep 19 10:57 OraHome1
drwxrwxr-x 4 oracle oinstall 512 Sep 19 10:55 jre
lrwxrwxrwx 1 root root 32 Sep 21 09:46 ocommon -> /u01/app/oracle/OraHome1/ocommon
drwxrwxr-x 12 oracle oinstall 512 Sep 19 10:58 oraInventory
drwxrwxr-x 6 oracle oinstall 512 Sep 19 10:55 oui
После того как линк создан, снова запускаю opensnoop, посмотреть все ли правильно:
{callacct:/root/DTraceToolkit-0.83} ./opensnoop -a
TIME STRTIME UID PID FD ERR PATH ARGS
426269122833 2005 Sep 21 09:48:32 0 16167 3 0 /etc/default/nss /usr/apache/bin/httpd\0
426269123107 2005 Sep 21 09:48:32 0 16167 3 0 /etc/nsswitch.conf /usr/apache/bin/httpd\0
426269123948 2005 Sep 21 09:48:32 0 16167 3 0 /usr/lib/nss_files.so.1 /usr/apache/bin/httpd\0
426269125739 2005 Sep 21 09:48:32 0 16167 3 0 /etc/group /usr/apache/bin/httpd\0
426269126027 2005 Sep 21 09:48:32 0 16167 3 0 /usr/lib/nss_ldap.so.1 /usr/apache/bin/httpd\0
426269126375 2005 Sep 21 09:48:32 0 16167 3 0 /usr/lib/libsldap.so.1 /usr/apache/bin/httpd\0
426269126819 2005 Sep 21 09:48:32 0 16167 3 0 /usr/lib/libldap.so.5 /usr/apache/bin/httpd\0
426269127479 2005 Sep 21 09:48:32 0 16167 3 0 /usr/lib/libsasl.so.1 /usr/apache/bin/httpd\0
426269127914 2005 Sep 21 09:48:32 0 16167 3 0 /usr/lib/mps/libnspr4.so /usr/apache/bin/httpd\0
426269128235 2005 Sep 21 09:48:32 0 16167 3 0 /usr/lib/mps/libplc4.so /usr/apache/bin/httpd\0
426269128437 2005 Sep 21 09:48:32 0 16167 3 0 /usr/lib/mps/libnss3.so /usr/apache/bin/httpd\0
426269128746 2005 Sep 21 09:48:32 0 16167 3 0 /usr/lib/mps/libssl3.so /usr/apache/bin/httpd\0
426269129088 2005 Sep 21 09:48:32 0 16167 3 0 /usr/lib/libthread.so.1 /usr/apache/bin/httpd\0
426269129445 2005 Sep 21 09:48:32 0 16167 3 0 /usr/lib/mps/libsoftokn3.so /usr/apache/bin/httpd\0
426269129865 2005 Sep 21 09:48:32 0 16167 3 0 /usr/lib/mps/libplds4.so /usr/apache/bin/httpd\0
426269142191 2005 Sep 21 09:48:32 0 16165 4 0 /usr/share/lib/zoneinfo/US/Central /usr/sbin/dtrace -n \n /*\n *
426269131883 2005 Sep 21 09:48:32 0 16167 3 0 /usr/lib/mps/cpu/sparcv8plus/libnspr_flt4.so /usr/apache/bin/httpd\0
426269138505 2005 Sep 21 09:48:32 0 16167 3 0 /var/run/ldap_cache_door /usr/apache/bin/httpd\0
426269141428 2005 Sep 21 09:48:32 0 16167 5 0 /u01/app/oracle/ocommon/nls/admin/data/lx1boot.nlb /usr/apache/bin/httpd\0
426269141760 2005 Sep 21 09:48:32 0 16167 5 0 /u01/app/oracle/ocommon/nls/admin/data/lx00001.nlb /usr/apache/bin/httpd\0
426269141930 2005 Sep 21 09:48:32 0 16167 5 0 /u01/app/oracle/ocommon/nls/admin/data/lx20369.nlb /usr/apache/bin/httpd\0
426269142360 2005 Sep 21 09:48:32 0 16167 5 0 /u01/app/oracle/ocommon/nls/admin/data/lx10001.nlb /usr/apache/bin/httpd\0
426269142722 2005 Sep 21 09:48:32 0 16167 5 0 /u01/app/oracle/ocommon/nls/admin/data/lx20001.nlb /usr/apache/bin/httpd\0
426269142811 2005 Sep 21 09:48:32 0 16167 -1 2 /u01/app/oracle/oracore/mesg/lrmus.msb /usr/apache/bin/httpd\0
426269142849 2005 Sep 21 09:48:32 0 16167 -1 2 /u01/app/oracle/oracore/mesg/lrmus.msb /usr/apache/bin/httpd\0
426269143055 2005 Sep 21 09:48:32 0 16167 -1 2 /u01/app/oracle/ldap/mesg/ldapus.msb /usr/apache/bin/httpd\0
426269143088 2005 Sep 21 09:48:32 0 16167 -1 2 /u01/app/oracle/ldap/mesg/ldapus.msb /usr/apache/bin/httpd\0
^C
Жалоб на наш 'lx1boot.nlb' больше нет, но теперь проблема с файлами в /u01/app/oracle/ldap и /u01/app/oracle/oracore. Но теперь мы уже знаем, что в /u01/app/oracle файлов oracore и ldap не существуют и они также вероятно нуждаются в symlink'ках:
{callacct:/u01/app/oracle} ls
OraHome1 jre ocommon oraInventory oui
{callacct:/u01/app/oracle} ln -s /u01/app/oracle/OraHome1/oracore oracore
{callacct:/u01/app/oracle} ln -s /u01/app/oracle/OraHome1/ldap ldap
{callacct:/u01/app/oracle} ls -al
total 20
drwxrwxr-x 6 oracle oinstall 512 Sep 21 09:54 .
drwx--x--x 3 oracle root 512 Sep 19 09:46 ..
-rwxr-xr-x 1 oracle oinstall 12 Sep 19 10:05 .login
drwxr-xr-x 28 oracle oinstall 512 Sep 19 10:57 OraHome1
drwxrwxr-x 4 oracle oinstall 512 Sep 19 10:55 jre
lrwxrwxrwx 1 root root 29 Sep 21 09:54 ldap -> /u01/app/oracle/OraHome1/ldap
lrwxrwxrwx 1 root root 32 Sep 21 09:46 ocommon -> /u01/app/oracle/OraHome1/ocommon
drwxrwxr-x 12 oracle oinstall 512 Sep 19 10:58 oraInventory
lrwxrwxrwx 1 root root 32 Sep 21 09:54 oracore -> /u01/app/oracle/OraHome1/oracore
drwxrwxr-x 6 oracle oinstall 512 Sep 19 10:55 oui
Запускаем opensnoop снова - ошибок больше нет и vmstat уже показывает cpu idle со значениями 100:
{callacct:/u01/app/oracle} vmstat 1
kthr memory page disk faults cpu
r b w swap free re mf pi po fr de sr m1 m1 m1 m2 in sy cs us sy id
0 0 0 17074528 445528 89 107 14 8 8 0 2 2 2 2 0 446 2551 669 1 1 98
0 0 0 16934600 154056 2 26 0 0 0 0 0 0 0 0 0 227 165 128 0 0 99
0 0 0 16934600 154056 0 0 0 0 0 0 0 0 0 0 0 229 85 117 0 0 100
0 0 0 16934600 154056 0 0 0 0 0 0 0 0 0 0 0 225 58 118 0 0 100
0 0 0 16934600 154056 0 0 0 0 0 0 0 0 0 0 0 231 63 107 0 0 100
Естественно, load averages также падают вниз:
{callacct:/u01/app/oracle} w
9:57am up 4 day(s), 22:33, 3 users, load average: 0.02, 0.10, 0.12
И больше никаких defunct-процессов.
(Вольный перевод заметки c hell.jedicoder.net - Derek Crudgington)