Was kann ein SIGPWR-Signal auslösen, das einen "sendmsg" -Systemaufruf unterbricht?
949
Sotirios Delimanolis
Auf einem RHEL 6-Host habe ich einen Cassandra-Server, der auf localhost auf TCP-Verbindungen wartet. Parallel dazu habe ich eine Client-Anwendung, die Anfragen sendet. Der Client (C # Mono) sendmsgsendet die serialisierten Bytes.
Ich sehe sendmsgständig die Rückgabe, ohne alle angeforderten Bytes gesendet zu haben. Ich habe straceversucht, das zu debuggen
sudo strace -p<pid> -s 100 -f -tt &> tmp.out
und Säge (gefilterte Probe für ein Gewindegang 47605)
Dies scheint darauf hinzudeuten, dass Thread mit TID 46142verwendet wurde tgkill, um ein SIGPWR-Signal an Thread mit Tid zu senden, 47605der gerade Bytes mit sendete sendmsg. Dies unterbrach es irgendwie und es wurden lediglich 16384 der 23937 Bytes angefordert.
Ich habe versucht zu sehen, ob der Thread mit tid 46142irgendetwas tut, das die Ursache des Problems erklären könnte tgkill, aber alles, was ich sehe, ist
was ich im Zusammenhang mit dem Aufruf des Netzwerksystems nicht verstehen kann.
Was könnte dazu führen, dass ein Thread ein SIGPWR-Signal sendet?
Ich bin nicht sicher, ob dies relevant ist, aber ich verwende eine Socket-Sendepuffergröße von 4096, und die MTU-Größe der Loopback-Schnittstelle ist auf 16436 festgelegt. Ich kann den Teil sendmsgmit diesen Größen konsistent reproduzieren . Wenn ich jedoch die MTU-Größe verdopple, geht das Problem weg. Ebenso kann ich das Problem nicht mehr reproduzieren, wenn ich die Sendepuffergröße meines Socket auf etwas sehr viel größer als 24000 gesetzt habe.
1 Antwort auf die Frage
1
grawity
Alles, was Threads tun, ist nur ein Teil des eigenen Codes oder einer von ihm verwendeten Bibliothek. Die Antwort auf "Was könnte einen Thread veranlassen, ein SIGPWR-Signal zu senden?" wird von Programm zu Programm variieren.
In Ihrem Fall ist es die Mono-Laufzeit, die diese intern verwendet. Soweit ich herausfinden konnte, werden SIGPWR und SIGXCPU verwendet, um den Garbage Collector auszulösen .
Danke für den Fund. Das klingt für die von mir verwendete Version von Mono korrekt. Ist sendmsg etwas Besonderes in der Art und Weise, wie der ausführende Thread ein Signal verarbeitet? Die Manpage schien das Szenario, in dem sie bereits mit dem Senden begonnen hat, nicht zu behandeln. (Auch eine Idee, warum die MTU einen Unterschied machen würde?)
Sotirios Delimanolis vor 7 Jahren
0