Comportement inattendu O_NONBLOCK

J’utilise socket et en définissant O_NONBLOCK avec fcntl mais toujours par application consommant 100% du processeur. Même j’utilise select avec un temps d’attente de 1 ms.

A des fins de lecture, j’utilise recv.

Je l’ai essayé sans O_NONBLOCK et dans ce cas, il ne consum pas 100% de CPU mais prend beaucoup de temps. J’ai essayé recv avec l’option O_NONBLOCK mais j’ai quand même pris beaucoup de temps (parfois 200 ms) à lire. Nous utilisons select alors pourquoi recv prend beaucoup de temps?

Je ne peux pas utiliser la première option (socket avec O_NONBLOCK) car le processeur est consommé et en seconde option il y a un délai.

Tout le monde peut suggérer les opinions. C’est une application client.

select () est optimisé pour entrer un état d’attente efficace (ne consommant pas beaucoup de CPU) lorsque vous utilisez un délai d’attente plus long. Essayez avec quelque chose comme 30 sec. Il sera renvoyé immédiatement lorsque l’activité se produit sur l’un des descripteurs de fichiers surveillés, afin que vous puissiez effectuer votre travail.

Essayez de regarder votre processus sous strace -v -ttt ou tcpdump pour rechercher des indices sur la latence élevée, ou affichez le code correspondant.

Sachez également que select peut modifier la structure timeval. N’oubliez donc pas de réinitialiser les valeurs entre les appels select ().

Je ne pense pas que ce soit inattendu. Si vous définissez le mode non bloquant, recv ne bloquera pas l’attente de quelque chose. En d’autres termes, il retournera si oui ou non les données sont disponibles et qu’il est très probable que cela ronge votre CPU.

Je pense aussi à augmenter un peu le délai de select . Il n’y a aucune raison de l’avoir aussi petit car cela risque aussi de faire chuter le CPU.

J’ai tendance à utiliser des valeurs comme une seconde pour le timeout select car c’est la latence dont j’ai besoin pour d’autres choses (comme le traitement rapide des signaux CTRL-BREAK).

Cela permet au processus de disposer de beaucoup de temps sans consumr beaucoup de ressources CPU en attendant que les données soient disponibles. S’il devient disponible en moins d’une seconde, vous le saurez plus tôt ( select reviendra).