2015-04-07 1 views
1

descripteur de fichier httperf Mon problème est le même que this question et this questionce [httperf --uri/--server limite

Je veux basiquement essayer de courir httperf avec connexion 10000 en parallèle comme 192.168.1.2 --port 8080 --num-conns = 500000 --rate 10000]

Je l'utilise sous Ubuntu 14.04.

D'abord, je pose la limite du descripteur de fichier système, voici ce qui est configuré dans mon SO maintenant:

$ ulimit -a -S 
core file size   (blocks, -c) 0 
data seg size   (kbytes, -d) unlimited 
scheduling priority    (-e) 0 
file size    (blocks, -f) unlimited 
pending signals     (-i) 31348 
max locked memory  (kbytes, -l) 64 
max memory size   (kbytes, -m) unlimited 
open files      (-n) 65530 
pipe size   (512 bytes, -p) 8 
POSIX message queues  (bytes, -q) 819200 
real-time priority    (-r) 0 
stack size    (kbytes, -s) 8192 
cpu time    (seconds, -t) unlimited 
max user processes    (-u) 31348 
virtual memory   (kbytes, -v) unlimited 
file locks      (-x) unlimited 


$ulimit -a -H                 
core file size   (blocks, -c) unlimited         
data seg size   (kbytes, -d) unlimited         
scheduling priority    (-e) 0           
file size    (blocks, -f) unlimited         
pending signals     (-i) 31348          
max locked memory  (kbytes, -l) 64           
max memory size   (kbytes, -m) unlimited         
open files      (-n) 65530          
pipe size   (512 bytes, -p) 8           
POSIX message queues  (bytes, -q) 819200          
real-time priority    (-r) 0           
stack size    (kbytes, -s) unlimited         
cpu time    (seconds, -t) unlimited         
max user processes    (-u) 31348          
virtual memory   (kbytes, -v) unlimited         
file locks      (-x) unlimited   

J'ai essayé de compiler la version HEAD du référentiel GitHub, mais il semble que complètement instable.

J'essaye aussi la version modifiée de la version 0.9.0 (changé /usr/include/x86_64-linux-gnu/bits/typesizes.h pour débloquer la FD_SETSIZE 1024) comme d'autres questions que les réponses suggèrent de faire. Après recompiler le httperf il revient sans cesse la même erreur:

*** buffer overflow detected ***: ./httperf terminated 
======= Backtrace: ========= 
/lib/x86_64-linux-gnu/libc.so.6(+0x73f1f)[0x7fdca440ef1f] 
/lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x5c)[0x7fdca44a682c] 
/lib/x86_64-linux-gnu/libc.so.6(+0x10a6f0)[0x7fdca44a56f0] 
/lib/x86_64-linux-gnu/libc.so.6(+0x10b777)[0x7fdca44a6777] 
./httperf[0x403c69] 
./httperf[0x4047e7] 
./httperf[0x4088df] 
./httperf[0x408d2e] 
./httperf[0x4071df] 
./httperf[0x40730b] 
./httperf[0x406791] 
./httperf[0x405e0e] 
./httperf[0x409afd] 
./httperf[0x406022] 
./httperf[0x404c1f] 
./httperf[0x4024ac] 
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5)[0x7fdca43bcec5] 
./httperf[0x40358b] 
======= Memory map: ======== 
00400000-00410000 r-xp 00000000 08:05 265276        
0060f000-00610000 r--p 0000f000 08:05 265276        
00610000-00611000 rw-p 00010000 08:05 265276        
00611000-0068a000 rw-p 00000000 00:00 0 
019da000-01c8f000 rw-p 00000000 00:00 0         [heap] 
7fdca4185000-7fdca419b000 r-xp 00000000 08:06 3277773     /lib/x86_64-linux-gnu/libgcc_s.so.1 
7fdca419b000-7fdca439a000 ---p 00016000 08:06 3277773     /lib/x86_64-linux-gnu/libgcc_s.so.1 
7fdca439a000-7fdca439b000 rw-p 00015000 08:06 3277773     /lib/x86_64-linux-gnu/libgcc_s.so.1 
7fdca439b000-7fdca4556000 r-xp 00000000 08:06 3279540     /lib/x86_64-linux-gnu/libc-2.19.so 
7fdca4556000-7fdca4756000 ---p 001bb000 08:06 3279540     /lib/x86_64-linux-gnu/libc-2.19.so 
7fdca4756000-7fdca475a000 r--p 001bb000 08:06 3279540     /lib/x86_64-linux-gnu/libc-2.19.so 
7fdca475a000-7fdca475c000 rw-p 001bf000 08:06 3279540     /lib/x86_64-linux-gnu/libc-2.19.so 
7fdca475c000-7fdca4761000 rw-p 00000000 00:00 0 
7fdca4761000-7fdca4866000 r-xp 00000000 08:06 3279556     /lib/x86_64-linux-gnu/libm-2.19.so 
7fdca4866000-7fdca4a65000 ---p 00105000 08:06 3279556     /lib/x86_64-linux-gnu/libm-2.19.so 
7fdca4a65000-7fdca4a66000 r--p 00104000 08:06 3279556     /lib/x86_64-linux-gnu/libm-2.19.so 
7fdca4a66000-7fdca4a67000 rw-p 00105000 08:06 3279556     /lib/x86_64-linux-gnu/libm-2.19.so 
7fdca4a67000-7fdca4a8a000 r-xp 00000000 08:06 3279536     /lib/x86_64-linux-gnu/ld-2.19.so 
7fdca4c63000-7fdca4c66000 rw-p 00000000 00:00 0 
7fdca4c85000-7fdca4c89000 rw-p 00000000 00:00 0 
7fdca4c89000-7fdca4c8a000 r--p 00022000 08:06 3279536     /lib/x86_64-linux-gnu/ld-2.19.so 
7fdca4c8a000-7fdca4c8b000 rw-p 00023000 08:06 3279536     /lib/x86_64-linux-gnu/ld-2.19.so 
7fdca4c8b000-7fdca4c8c000 rw-p 00000000 00:00 0 
7ffff050b000-7ffff052c000 rw-p 00000000 00:00 0       [stack] 
7ffff05fe000-7ffff0600000 r-xp 00000000 00:00 0       [vdso] 
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0     [vsyscall] 

Je ne suis pas familliar avec syscall faible niveau tel que de sélectionner, mais pour autant que je peux dire utiliser htperf 0.9.0 sélectionnez pour gérer les événements de socket et ce syscall est limité par une taille codée en dur de 1024 de la limite du descripteur de fichier. Alors vous avez une idée de ce que je fais mal? Comment puis-je débloquer la limite 1024?

Répondre

0

Vous ne souhaitez peut-être pas utiliser les descripteurs 10K en un seul processus. Si vous décidez de le faire, vous voudrez probablement diviser le traitement de sorte qu'un seul appel à select() ne traite pas tous les descripteurs 10K (ou les performances, pour utiliser un terme technique descriptif, sucent). Voir Wikipedia sur le C10K Problem ou l'étiquette SO - que cette question est déjà étiqueté, de sorte que vous êtes au moins au courant de la classification.

Vous devez regarder ulimit -a -H vs ulimit -a -S pour voir combien de diverses ressources dont vous disposez (ou remplacer -a avec -n pour obtenir des « descripteurs de fichiers » 'alias des fichiers ouverts de). Si vous avez une limite dure inférieure à 10K, vous êtes dans la recompilation du noyau, ou au moins trouver la source de cette limite supérieure dans la configuration. Si la limite dure est plus grande, vous pouvez remplacer la limite par ulimit sur la ligne de commande ou par les fonctions POSIX getrlimit() et setrlimit() et RLIMIT_NOFILE.

+0

Spliter n'est pas une mauvaise idée, malheureusement, httperf ne supporte pas le mutiprocessing qui ferait l'affaire. À la documentation de httperf est très explicite qu'il ne doit pas exécuter deux processus de httperf en même temps. – Thiago

+0

Je pensais à plusieurs threads, mais il y a probablement des contraintes sur ça aussi. Il faut du temps pour scanner plus de 10 k descripteurs de fichiers, à la fois dans le noyau et dans le processus. Soit prudent. –