Отладка тайм-аутов соединения с использованием strace?

16982
jabalsad

Я пытаюсь выяснить, почему вращается «Затмение», поэтому я решил запустить «Стрейс».

Я нашел процесс затмения, используя:

$ ps ax | grep java 5546 ? Sl 19:04 /usr/bin/java ... [arguments omitted] 

Запустив 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 (со случайным успехом)

read(16, 0x7f6c41664d10, 16) = -1 EAGAIN (Resource temporarily unavailable) recvfrom(15, 0x7f6c3815f2e4, 4096, 0, 0, 0) = -1 EAGAIN (Resource temporarily unavailable) clock_gettime(CLOCK_MONOTONIC, ) = 0 poll([,, ,, ], 5, 0) = 0 (Timeout) read(16, 0x7f6c41664cb0, 16) = -1 EAGAIN (Resource temporarily unavailable) recvfrom(15, 0x7f6c3815f2e4, 4096, 0, 0, 0) = -1 EAGAIN (Resource temporarily unavailable) ... 

Судя по выходу, она выглядит, как он опрашивает файл дескрипторы 16, 15, 68, 128 и 69. В частности, EAGAINошибки приходят от FDS 15 и 6, как видно из read(2)и recvfrom(2)вызовов.

Как я могу найти больше информации об этих FDS? Я пытался, lsof -p 5547но вывод не печатается. Я подозреваю, что это сокеты, которые открыты для какого-то веб-сайта, но почему он крутится в тесной петле с EAGAINошибками, озадачивает ...

4

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 11 лет назад 0
Кроме того, не было бы менее ресурсоемким, если бы сокеты использовали обратные вызовы, чтобы узнать, когда поступили данные? jabalsad 11 лет назад 0
@jabalsad: `poll ()` уже используется для этого. Я не знаю, однако, почему он возвращает ``, если нечего читать () из него .. grawity 11 лет назад 0
Вы имеете в виду, что когда вызывается `poll ()`, приложение должно знать, что данные доступны для чтения или нет? Если так, почему `read ()` все еще выполняется, когда нет доступных данных? jabalsad 11 лет назад 0
Неважно, ваш добавленный комментарий ответил на мой вопрос. jabalsad 11 лет назад 0
@jabalsad: Ах, я только что заметил несколько вещей. Во-первых, fd, отображаемые в выводе strace, на самом деле * input * в poll (), а не его вывод (как было бы в случае с select ()), поэтому естественно, что strace показывает все опрашиваемые fd. Во-вторых, `poll ()` возвращает 0, что означает "тайм-аут, нет событий", поэтому у fd действительно нет новых данных; библиотека, вероятно, просто не может правильно проверить код возврата. grawity 11 лет назад 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.

Похожие вопросы