Ошибка ошибки сегментации httperf в OS X 10.7.1

Когда я пытаюсь выполнить нагрузочный тест с использованием httperf с высокой частотой запросов, я получаю следующую ошибку:

» httperf --client=0/1 --server=www.xxxxx.com --port=80 --uri=/ --send-buffer=4096 --recv-buffer=16384 --num-conns=200 --rate=30
httperf --client=0/1 --server=staging.truecar.com --port=80 --uri=/ --rate=30 --send-buffer=4096 --recv-buffer=16384 --num-conns=200 --num-calls=1
httperf: warning: open file limit > FD_SETSIZE; limiting max. # of open files to FD_SETSIZE
**Segmentation fault: 11**

Ошибка возникает, когда «скорость»> 15

Версии:

httpперф 0.9.0

OS X 10.7.1


person Mike Hemelberg    schedule 08.09.2011    source источник
comment
Я вижу то же самое на OSX 10.6.8 с httperf 0.8.1 и 0.9.0.   -  person jches    schedule 06.10.2011
comment
Я вижу это, даже с установленной скоростью > 1. Кажется, что он работает немного дольше, прежде чем сегфоулты на 2, но 3 segfaults очень быстро.   -  person Jesse    schedule 21.10.2011
comment
Проверьте, не закончилась ли у вас память.   -  person qwertzguy    schedule 17.11.2011
comment
В вашей системе заканчиваются файловые дескрипторы. IIRC, это происходит с пакетами RPM, использующими слишком маленький __FD_SETSIZE (например, 1024). Наверняка вам потребуется перекомпилировать ограничивающие пакеты RPM (например, glibc, Apache, PHP и т. д.), чтобы увеличить __FD_SETSIZE, поэтому я предлагаю перенести вопрос на Server Ошибка.   -  person Jürgen Thelen    schedule 02.12.2011
comment
Я получаю ту же проблему на CentOS 6 x64 с Apache 2.2.15, но не на Debian 6 x64 с Nginx 1.2.3, используя httperf-0.9.0 на обоих. Пределы открытых файлов одинаковы (1024) на обоих.   -  person tacotuesday    schedule 17.08.2012


Ответы (3)


Как указано в предупреждении, количество подключений к http-серверу превышает максимально допустимое количество открытых файловых дескрипторов. Вполне вероятно, что хотя httperf ограничивает значение до FD_SETSIZE, вы выходите за этот предел.

Вы можете проверить предельное значение с помощью ulimit -a

$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 256
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 709
virtual memory          (kbytes, -v) unlimited

Попробуйте увеличить лимит с помощью ulimit -n <n>

$ ulimit -n 2048
$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 2048
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 709
virtual memory          (kbytes, -v) unlimited

Это обычная практика на больших веб-серверах и т.п., поскольку сокет — это, по сути, просто открытый файловый дескриптор.

person ben lemasurier    schedule 16.12.2011
comment
Как указал @Tom van der Woerdt/@m_pahlevanzadeh, замените umlimit на limit, если вы используете csh, а не bash/ksh - person ben lemasurier; 25.01.2012
comment
Спасибо за советы. Но это не устраняет ошибку сегментации и, скорее всего, не является основной причиной вопроса. Читая документацию httperf, он действительно знает о доступных файловых дескрипторах. Он будет регистрировать недоступные файловые дескрипторы и выводить их после одного запуска. Программа не должна давать сбой, если у вас закончатся файловые дескрипторы. - person Overbryd; 25.06.2012
comment
У Басё есть удобное руководство по увеличению лимита открытых файлов с помощью шагов для Lion. По сути, добавьте limit maxfiles 16384 32768 в файл с именем /etc/launchd.conf (создайте его, если он отсутствует). Перезагрузить. Проверьте новое значение с помощью ulimit -a или launchctl limit. Я все еще получаю segfault, хотя. - person rud; 19.09.2012
comment
Не работает. У меня уже есть следующий набор: open files (-n) 640000 - person emirhosseini; 20.09.2020

Попробуйте использовать gdb и используйте что-то вроде:

$ gdb httperf --client=0/1 --server=staging.truecar.com \
--port=80 --uri=/ --rate=30 --send-buffer=4096 \
--recv-buffer=16384 --num-conns=200 --num-calls=1

Это вызовет gdb, и вы должны увидеть подсказку (gdb).

Затем: run и введите.

Если произойдет сбой, введите bt (обратная трассировка). Исследуйте и/или поделитесь здесь.

person Till    schedule 06.12.2011
comment
У меня та же проблема, что и в исходном вопросе. Вот вывод предложенного вами запуска gdb: gist.github.com/2990517 - person Overbryd; 25.06.2012
comment
ИМХО, это может быть еще один случай, когда в вашей системе заканчиваются файловые дескрипторы. Другой причиной может быть плохое управление памятью в httperf. Вместо этого вы можете попробовать использовать sysbench. - person Till; 26.06.2012
comment
Вероятно, это проблема внутри httperf. Sysbench для меня бесполезен, так как я хочу протестировать веб-сервер. - person Overbryd; 27.06.2012
comment
В конце концов, я использовал частично осаду и в основном цунг. - person Overbryd; 10.09.2012

ksh и bash используют ulimit, а csh использует команду limit.

person PersianGulf    schedule 25.12.2011
comment
Также используйте команду lsof для просмотра открытых файлов и работы с этой командой со следующими дистрибутивами: AIX 5.3, FreeBSD 4.9 для систем на базе x86, FreeBSD 7.0 и 8.0 для систем на базе AMD64, Linux 2.1.72 и выше для систем на базе x86. и Солярис 9 и 10. @вчера - person PersianGulf; 27.12.2011