Запустив straceэтот процесс, я вижу, что он ожидает другого процесса:
$ sudo strace -p 5546 Process 5546 attached - interrupt to quit futex(0x7f6c416679d0, FUTEX_WAIT, 5547, NULL^C <unfinished ...> Process 5546 detached
Интересно, что процесс 5547 не появляется ps(может кто-нибудь сказать мне, почему?), Но я могу straceэто сделать. Он многократно выплевывает множество ошибок EAGAIN (со случайным успехом)
Судя по выходу, она выглядит, как он опрашивает файл дескрипторы 16, 15, 68, 128 и 69. В частности, EAGAINошибки приходят от FDS 15 и 6, как видно из read(2)и recvfrom(2)вызовов.
Как я могу найти больше информации об этих FDS? Я пытался, lsof -p 5547но вывод не печатается. Я подозреваю, что это сокеты, которые открыты для какого-то веб-сайта, но почему он крутится в тесной петле с EAGAINошибками, озадачивает ...
2 ответа на вопрос
2
grawity
Некоторые PID не указаны в списке, потому что они принадлежат потокам . htopможет показать их, если вы нажмете Shift+H(и, необязательно, Tдля просмотра в виде дерева), но захотите lsofPID основного процесса. (В любом случае все pthreads в процессе совместно используют файловые дескрипторы.) Вы также можете посмотреть /proc/5546/fd/и /proc/5546/task/.
EAGAIN является нормальным для неблокирующего ввода / вывода; например, он возвращается, read()когда нет данных для чтения. Смотрите «ОШИБКИ» в read (2), write (2) и так далее. Некоторые из этих fd, скорее всего, являются соединениями с сервером X11 - неблокирующие операции ввода-вывода используются клиентскими библиотеками X11.
Спасибо, теперь я стал немного лучше в отладке :-)
jabalsad 12 лет назад
0
Кроме того, не было бы менее ресурсоемким, если бы сокеты использовали обратные вызовы, чтобы узнать, когда поступили данные?
jabalsad 12 лет назад
0
@jabalsad: `poll ()` уже используется для этого. Я не знаю, однако, почему он возвращает ``, если нечего читать () из него ..
grawity 12 лет назад
0
Вы имеете в виду, что когда вызывается `poll ()`, приложение должно знать, что данные доступны для чтения или нет? Если так, почему `read ()` все еще выполняется, когда нет доступных данных?
jabalsad 12 лет назад
0
Неважно, ваш добавленный комментарий ответил на мой вопрос.
jabalsad 12 лет назад
0
@jabalsad: Ах, я только что заметил несколько вещей. Во-первых, fd, отображаемые в выводе strace, на самом деле * input * в poll (), а не его вывод (как было бы в случае с select ()), поэтому естественно, что strace показывает все опрашиваемые fd. Во-вторых, `poll ()` возвращает 0, что означает "тайм-аут, нет событий", поэтому у fd действительно нет новых данных; библиотека, вероятно, просто не может правильно проверить код возврата.
grawity 12 лет назад
0
2
Josip Rodin
The third parameter to futex(2) is not necessarily a process ID, the manual says it's futex(uaddr, op, val, timeout, ...), and that if op is FUTEX_WAIT, it "atomically verifies that the futex address uaddr still contains the value val, and sleeps awaiting FUTEX_WAKE on this futex address. [When] timeout is NULL, the call blocks indefinitely."
In your case, it sounds like the process 5546 was sitting there waiting for something -- presumably its thread 5547 or something related, but we can't know exactly what for sure based only on this -- to write that number at the specified memory address.
Note also that you can see threads by using ps -eLf or similar.