Используя 2.6.30-gentoo-r4
Linux, выполняется очень сложная система php
кода (с 4.4.9-pl0-gentoo и 5.2.10-pl0-gentoo), которая время от времени сталкивается с проблемой блокировки семафора. Вызов функции php
блокируется sem_acquire
, что в конечном итоге приводит систему к сбою.
Однако этот семафор, о котором идет речь, похоже, не заблокирован другим php
процессом, что побудило меня к дальнейшему исследованию. Мне удалось идентифицировать php
рассматриваемый процесс и strace
его, что привело к блокирующему семафору:
....
09:03:25 gettimeofday({1415696605, 778078}, NULL) = 0
09:03:25 close(5) = 0
09:03:25 gettimeofday({1415696605, 778483}, NULL) = 0
09:03:25 gettimeofday({1415696605, 778708}, NULL) = 0
09:03:25 semop(0, 0xbf8f1692, 1 <unfinished ...>
Этот конкретный вывод semop(0, 0xbf8f1692, 1)
не очень мне помогает, так как я не могу увидеть содержимое struct sembuf
(второй аргумент semop
). Может быть, кто-то еще видит проблему непосредственно с этим semop
вызовом?
В любом случае, я продолжил расследование, чтобы проверить память по адресу 0xbf8f1692
(как root):
> gdb --pid 1236
GNU gdb 6.8
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "i586-pc-linux-gnu".
Attaching to process 1236
ptrace: Operation not permitted.
(gdb) dump memory /root/output 0xbf8f1692 0xbf9f1692
(gdb) quit
> hexdump -C output
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00100000
Означает ли это, что semop
вызывается с struct sembuf
указанием на кучу нулей? Или я что-то сделал неправильно, чтобы узнать память, чтобы увидеть, какие аргументы semop
? Есть ли другие способы увидеть, что происходит в этом semop
вызове?
Дополнительная информация:
- Система Linux не знает ни команды
prctl
, ниptrace
. - Указанный каталог
/proc/sys/kernel/yama
не существует (см.предлагаемая информация).