Comment vérifier si un process n'est pas bloqué dans linux sans utiliser un traceur de stack?

Un server multi-processeur exécute plusieurs process. Un process a un thread qui doit toujours être en phase de rotation, en utilisant 100% de la CPU, il a été assigné. Ma méthode actuelle (en plus de requestr au développeur …) utilise strace sur le process qui attend des informations pour arriver à son descripteur de file ouvert et vérifie en continu en utilisant recvfrom(2)erno est réglé sur EAGAIN et la méthode est en return -1 quand aucun package ne doit être lu à partir d'une prise réseau.

Je ne suis pas à l'aise des configurations de production de traçage de stack, et c'est une façon difficile de déterminer cette information au mieux. Je faisais appel de proc(5) et je pensais que la valeur du champ de drapeaux dans /proc/[pid]/fdinfo pourrait être utile pour vérifier si ce process utilisait un socket appelé open(2) avec le mode O_NONBLOCK .

Je suis en train de faire de l'ingénierie inverse cette valeur en ce moment. Je sais que cela représente l'OR bit à bit de l'état du file et du mode de file. Je pense donc que je peux vérifier les en-têtes source pour la valeur des constantes open(2) sur ce kernel particulier, puis sur le bit ou les OR jusqu'à ce que je trouve une valeur correspondant à ce qui se trouve dans fdinfo . Cela semble plutôt clunky, si quelqu'un peut valider la méthode ci-dessus (je ne peux pas encore) ou fournir une solution plus élégante, je serais très obligé.

Je sais aussi que fnctl(2) peut définir un descripteur de file dans un état non bloquant, mais je considère que l'équivalent d'ouvrir pour le moment

One Solution collect form web for “Comment vérifier si un process n'est pas bloqué dans linux sans utiliser un traceur de stack?”

Oui, c'est un moyen valide de vérifier que la prise n'est pas bloquante.

La valeur pour une socket non bloquante est 04000, les sockets non bloquantes dans /proc/<pid>/fdinfo sont représentées en octal.

Vous pouvez valider ce comportement avec python.

 Python 2.7.5 (default, Feb 19 2014, 13:47:28) [GCC 4.8.2 20131212 (Red Hat 4.8.2-7)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> from socket import * >>> import os >>> from os import O_NONBLOCK >>> s = socket(AF_INET, SOCK_STREAM) >>> s.setblocking(0) >>> print open("/proc/self/fdinfo/{0}".format(s.fileno())).read(4096) pos: 0 flags: 04002 >>> if 04002 & O_NONBLOCK: ... print "yes" ... else: ... print "no" ... yes 

Donc, maintenant, vous savez comment, je dois souligner que votre développeur le fait mal . Si les sockets non bloquants sont quelque chose qu'ils veulent utiliser, c'est très bien – mais ils devraient installer un epoll(2) sur le socket et bloquer sur le sondage à la place.

Le programme ne gagne rien à partir de la read(2) sur une prise non bloquante qui produit EAGAIN – en fait, le résultat est pire parce que presque tous les appels système sont un sharepoint préemption où le kernel peut vous changer de context.

Ce développeur perd du pouvoir, des cycles de CPU qui pourraient être utilisés pour les threads au ralenti et ne gagne en aucun cas les avantages qu'il / elle fait de cette manière.

Si le développeur veut être «cache-line» amical, épingler ses tâches à un processeur particulier et se faire avec lui.

Les astuces du serveur de linux et windows, tels que ubuntu, centos, apache, nginx, debian et des sujets de réseau.