Что может вызвать сигнал SIGPWR, который прерывает системный вызов 'sendmsg'?
931
Sotirios Delimanolis
На хосте RHEL 6 у меня есть сервер Cassandra, который прослушивает TCP-соединения на локальном хосте. Параллельно у меня есть клиентское приложение, которое отправляет ему запросы. Клиент (C # Mono) использует sendmsgдля отправки сериализованных байтов.
Я последовательно вижу sendmsgвозврат, не отправив все запрошенные байты. Я straceпытался отладить это
sudo strace -p<pid> -s 100 -f -tt &> tmp.out
и увидел (отфильтрованный образец для нити TID 47605)
Похоже, что это указывает на то, что поток с tid 46142использовал tgkillдля отправки сигнала SIGPWR потоку с tid, 47605который находился в процессе отправки байтов с помощью sendmsg. Это каким-то образом прервало его и закончилось отправкой 16384 из 23937 запрошенных байтов.
Я пытался увидеть, что нить с tid 46142делает что-нибудь, что может объяснить причину tgkill, но все, что я вижу, это
что я не могу понять в контексте системного вызова сети.
Что может привести к тому, что поток отправит сигнал SIGPWR?
Я не уверен, что это уместно, но я использую размер буфера отправки сокета 4096, а размер MTU интерфейса обратной связи установлен на 16436. Я могу последовательно воспроизводить частичное sendmsgс этими размерами. Однако, если я удвою размер MTU, проблема исчезнет. Точно так же, если я установлю размер буфера отправки моего сокета на что-то намного большее, например, 24000, я больше не смогу воспроизвести проблему.
1 ответ на вопрос
1
grawity
Все, что делают потоки, является лишь частью собственного кода программы или какой-то библиотеки, которую она использует. Таким образом, ответ на вопрос «Что может заставить поток отправлять сигнал SIGPWR?» будет варьироваться от программы к программе.
В вашем случае это среда исполнения Mono, которая использует их внутренне. Из того, что я мог узнать, SIGPWR и SIGXCPU используются для запуска сборщика мусора .
Спасибо за находку. Это звучит правильно для версии Mono, которую я использую. Является ли `sendmsg` особенным в том, как исполняющий поток обрабатывает сигнал? Похоже, его справочная страница не соответствует сценарию, по которому она уже начала отправляться. (Кроме того, есть идеи, почему MTU будет иметь значение?)
Sotirios Delimanolis 7 лет назад
0