OVH Cloud OVH Cloud

nombre de filedes utilisés

10 réponses
Avatar
Desnos Samuel
Bonjour.
je suis en train de travailler sur le portage d'une application de
solaris 2.5.1 vers solaris 8. Je travaille sur une vieille machine (ultra2).
L'application que je teste plante si mon nombre de file descriptor
(initialisé via ulimit) est trop faible.
Voici ma question :
Comment lors de l'execution d'un programme compilé dont on ne dispose
pas des sources, savoir qu'il s'approche d'une limite quelconque ? En
gros, y aurait-il un utilitaire genre truss capable de me dire que je
suis arrive à 255 filedes et que la prochaine demande sera forcément
rejetée ?

Merci de toute l'aide que vous pourrez m'apporter.

10 réponses

Avatar
Stephane Chazelas
2005-02-01, 21:31(+01), Desnos Samuel:
je suis en train de travailler sur le portage d'une application de
solaris 2.5.1 vers solaris 8. Je travaille sur une vieille machine (ultra2).
L'application que je teste plante si mon nombre de file descriptor
(initialisé via ulimit) est trop faible.
Voici ma question :
Comment lors de l'execution d'un programme compilé dont on ne dispose
pas des sources, savoir qu'il s'approche d'une limite quelconque ? En
gros, y aurait-il un utilitaire genre truss capable de me dire que je
suis arrive à 255 filedes et que la prochaine demande sera forcément
rejetée ?
[...]


Tu peux utiliser lsof.

Dans /proc/<pid>, ya rien d'interessant?

--
Stéphane

Avatar
Erwann ABALEA
Bonsoir,

On Tue, 1 Feb 2005, Desnos Samuel wrote:

je suis en train de travailler sur le portage d'une application de
solaris 2.5.1 vers solaris 8. Je travaille sur une vieille machine (ultra2).


Rhoo l'ôt eh... C'est très bien une Ultra2, c'est justement ce que
j'utilise à l'instant (ma machine principale). ;)
Ca fait plaisir à EDF et à mon chat.

L'application que je teste plante si mon nombre de file descriptor
(initialisé via ulimit) est trop faible.


Elle plante au sens de core dump, ou au sens de "j'ai pas pu ouvrir tel
fichier"?

Voici ma question :
Comment lors de l'execution d'un programme compilé dont on ne dispose
pas des sources, savoir qu'il s'approche d'une limite quelconque ? En
gros, y aurait-il un utilitaire genre truss capable de me dire que je
suis arrive à 255 filedes et que la prochaine demande sera forcément
rejetée ?


A part truss justement, je ne vois pas. Peut-être le tout nouveau DTrace
sous Solaris 10, mais dans ce cas précis, ça équivaut à un truss avec les
bonnes options (filtre sur open, close, dup, ...).

Si tu arrives à stabiliser ton programme, et que tu veux compter le nombre
de fichiers ouverts, lsof peut t'aider, si tu arrives à distinguer les
fichiers qu'ouvre ton application de ceux qu'ouvre le système pour toi.

--
Erwann ABALEA - RSA PGP Key ID: 0x2D0EABD5
-----
The wrong way always seems the more reasonable.

Avatar
Vincent Bernat
OoO En ce début de soirée du mardi 01 février 2005, vers 21:31, Desnos
Samuel disait:

Comment lors de l'execution d'un programme compilé dont on ne dispose
pas des sources, savoir qu'il s'approche d'une limite quelconque ? En
gros, y aurait-il un utilitaire genre truss capable de me dire que je
suis arrive à 255 filedes et que la prochaine demande sera forcément
rejetée ?


Je ne sais pas si c'est le cas avec Solaris, mais sous Linux, il y a
une limite soft et une limite hard. Ton application peut repousser la
limite soft jusqu'à la limite hard. La page de man indique que c'est
SVr4, donc probable que cela fonctionne sous Solaris. Le plus simple
est de regarder la page de man de setrlimit(2).

Toutefois, je ne comprends pas bien l'intérêt de buter sur la limite
pour la connaître : tu peux directement l'obtenir avec getrlimit(2).
--
panic("IRQ, you lose...");
2.2.16 /usr/src/linux/arch/mips/sgi/kernel/indy_int.c

Avatar
Desnos Samuel
2005-02-01, 21:31(+01), Desnos Samuel:

je suis en train de travailler sur le portage d'une application de
solaris 2.5.1 vers solaris 8. Je travaille sur une vieille machine (ultra2).
L'application que je teste plante si mon nombre de file descriptor
(initialisé via ulimit) est trop faible.
Voici ma question :
Comment lors de l'execution d'un programme compilé dont on ne dispose
pas des sources, savoir qu'il s'approche d'une limite quelconque ? En
gros, y aurait-il un utilitaire genre truss capable de me dire que je
suis arrive à 255 filedes et que la prochaine demande sera forcément
rejetée ?


[...]

Tu peux utiliser lsof.

Dans /proc/<pid>, ya rien d'interessant?

Merci pour lsof je vais essayer cela demain.

Pour /proc/<pid>, malheureusement le programme est trop rapide en
execution pour pouvoir réellement constater quelquechose. C'est pour
cela que j'étais parti sur truss qui etudie le programme durant son
execution.
D'ailleurs, lorsque je lance un truss sur mon programme avec quelques
options lourdes (-u :: par exemple), il fonctionne très bien. Mais je ne
me vois pas modifier les shells pour les ralentir sciemment.


Avatar
Desnos Samuel
Bonsoir,

On Tue, 1 Feb 2005, Desnos Samuel wrote:


[...]


L'application que je teste plante si mon nombre de file descriptor
(initialisé via ulimit) est trop faible.



Elle plante au sens de core dump, ou au sens de "j'ai pas pu ouvrir tel
fichier"?


Bonne question : Le programme est l'executable netutil appelé par le
shell iisunet de ingres (initialisation d'une connexion cliente). Ce
programme se contente de dire qu'il n'a pas réussi a contacter le
serveur et que je dois vérifier les mots de passe. Je pense que c'est sa
réponse bateau lorsqu'il n'arrive pas à ouvrir une socket.



Voici ma question :
Comment lors de l'execution d'un programme compilé dont on ne dispose
pas des sources, savoir qu'il s'approche d'une limite quelconque ? En
gros, y aurait-il un utilitaire genre truss capable de me dire que je
suis arrive à 255 filedes et que la prochaine demande sera forcément
rejetée ?



A part truss justement, je ne vois pas. Peut-être le tout nouveau DTrace
sous Solaris 10, mais dans ce cas précis, ça équivaut à un truss avec les
bonnes options (filtre sur open, close, dup, ...).

Si tu arrives à stabiliser ton programme, et que tu veux compter le nombre
de fichiers ouverts, lsof peut t'aider, si tu arrives à distinguer les
fichiers qu'ouvre ton application de ceux qu'ouvre le système pour toi.



Je me lance sur lsof.
Merci


Avatar
Desnos Samuel
OoO En ce début de soirée du mardi 01 février 2005, vers 21:31, Desnos
Samuel disait:


Comment lors de l'execution d'un programme compilé dont on ne dispose
pas des sources, savoir qu'il s'approche d'une limite quelconque ? En
gros, y aurait-il un utilitaire genre truss capable de me dire que je
suis arrive à 255 filedes et que la prochaine demande sera forcément
rejetée ?



Je ne sais pas si c'est le cas avec Solaris, mais sous Linux, il y a
une limite soft et une limite hard. Ton application peut repousser la
limite soft jusqu'à la limite hard. La page de man indique que c'est
SVr4, donc probable que cela fonctionne sous Solaris. Le plus simple
est de regarder la page de man de setrlimit(2).

Toutefois, je ne comprends pas bien l'intérêt de buter sur la limite
pour la connaître : tu peux directement l'obtenir avec getrlimit(2).


Connaitre la limite, c'est simple. Le probleme c'est de savoir ou en est
rendu le programme qui me plante. Si j'en avais les sources, il est sure
que je pourrais m'amuser à les modifier pour obtenir davantage d'infos.
Mais malheureusement, je ne les ai pas.


Avatar
Vincent Bernat
OoO En cette soirée bien amorcée du mardi 01 février 2005, vers 22:12,
Vincent Bernat disait:

Comment lors de l'execution d'un programme compilé dont on ne dispose
pas des sources, savoir qu'il s'approche d'une limite quelconque ? En
gros, y aurait-il un utilitaire genre truss capable de me dire que je
suis arrive à 255 filedes et que la prochaine demande sera forcément
rejetée ?


Je ne sais pas si c'est le cas avec Solaris, mais sous Linux, il y a
une limite soft et une limite hard. Ton application peut repousser la
limite soft jusqu'à la limite hard. La page de man indique que c'est
SVr4, donc probable que cela fonctionne sous Solaris. Le plus simple
est de regarder la page de man de setrlimit(2).

Toutefois, je ne comprends pas bien l'intérêt de buter sur la limite
pour la connaître : tu peux directement l'obtenir avec getrlimit(2).


Je m'aperçois que j'ai répondu à côté de la plaque. Tant pis. Je
laisse quand même l'article, après tout, ça peut servir ! ;-)
--
Avoid unnecessary branches.
- The Elements of Programming Style (Kernighan & Plaugher)


Avatar
Stephane Chazelas
2005-02-01, 21:31(+01), Desnos Samuel:
Bonjour.
je suis en train de travailler sur le portage d'une application de
solaris 2.5.1 vers solaris 8. Je travaille sur une vieille machine (ultra2).
L'application que je teste plante si mon nombre de file descriptor
(initialisé via ulimit) est trop faible.
Voici ma question :
Comment lors de l'execution d'un programme compilé dont on ne dispose
pas des sources, savoir qu'il s'approche d'une limite quelconque ? En
gros, y aurait-il un utilitaire genre truss capable de me dire que je
suis arrive à 255 filedes et que la prochaine demande sera forcément
rejetée ?
[...]


Avec gdb, tu peut mettre des breakpoints sur toutes les
fonctions de la libc qui creent ou detruisent un fd (open,
socket, close, dup...(utilise truss (-u) d'abord pour reduire la
liste)) et faire executer automatiquement par gdb du code gdb
pour faire ce que tu veux (compter des fds, lancer lsof...) puis
poursuivre l'execution du programme (voir .gdbinit, "command",
"break" dans gdb)

Note que lsof -p <pid> te donnera juste la liste des fichiers
ouverts a un instant donné. Donc, si /proc/<pid> ne convient
pas, lsof ne conviendra pas non plus, a moins d'avoir un
mechanisme comme au dessus ou dessous pour lancer la commande a
des instants bien specifiques.

Ce que tu peux aussi faire, c'est utiliser le mechanisme de
LD_PRELOAD pour surcharger toutes les fonctions de la libc qui
creent/ferment un fd.

--
Stéphane

Avatar
Erwann ABALEA
On Wed, 2 Feb 2005, Stephane Chazelas wrote:

[...]
Ce que tu peux aussi faire, c'est utiliser le mechanisme de
LD_PRELOAD pour surcharger toutes les fonctions de la libc qui
creent/ferment un fd.


J'avais pensé à ça aussi, plus tard... Mais bon. Si l'OP n'a pas le
source, il ne peut pas modifier le programme, donc finalement je ne vois
pas à quoi ça sert de savoir où et pourquoi ça plante... Soit on fait un
"ulimit -n xxx" avant de lancer le soft pour compenser, soit on ne le fait
pas et ça plante... Quoi d'autre?

--
Erwann ABALEA - RSA PGP Key ID: 0x2D0EABD5
-----
Bonsoir laurco, ici , te souviens tu de moi ? Tu
étais venu me voir un jour à Paris Montparnasse.Qu'est ce que tu
deviens?Si tu veux téléphone moi au :0607xxxxxx.A Bientôt. Guy
-+- GF in <http://neuneu.mine.nu> : Mon Parnasse chez les neuneux -+-

Avatar
Stephane Chazelas
2005-02-2, 14:30(+01), Erwann ABALEA:
On Wed, 2 Feb 2005, Stephane Chazelas wrote:

[...]
Ce que tu peux aussi faire, c'est utiliser le mechanisme de
LD_PRELOAD pour surcharger toutes les fonctions de la libc qui
creent/ferment un fd.


J'avais pensé à ça aussi, plus tard... Mais bon. Si l'OP n'a pas le
source, il ne peut pas modifier le programme, donc finalement je ne vois
pas à quoi ça sert de savoir où et pourquoi ça plante... Soit on fait un
"ulimit -n xxx" avant de lancer le soft pour compenser, soit on ne le fait
pas et ça plante... Quoi d'autre?


L'idee est peut-etre qu'il est possible de prendre des actions
(comme attendre que des connexions se terminent, ou les fermer a
l'autre bout) quand on s'approche du point de rupture.

--
Stéphane