Использование Python asyncore для нагрузочного / стресс-тестирования сайта - PullRequest
2 голосов
/ 28 июля 2011

Надеюсь, кто-нибудь сможет помочь с этим.

Короткая версия: я собираюсь создать свой собственный тестер стресса на сайте на Python.

Почему?Потому что мне это нравится :) Я не ищу готовое решение [например, funkload или JMeter].Это кажется интересным занятием по программированию.Я также думаю, что изучение того, как делать то, что я хочу, может быть полезно позже в других ситуациях.

Что я хочу, чтобы это делало?Я намерен сделать его более сложным с течением времени, но моя первая цель проста: сделать как можно больше запросов в кратчайшие сроки.Я стреляю по 300-500 запросов в секунду.

Я пробовал несколько разных методов.Двумя наиболее перспективными являются:

  1. Нити порождения.Много их.Пусть каждый поток сделает один запрос.Это оказалось самым быстрым [легко получить около 1 запроса в секунду на поток - 500 потоков означало почти 500 запросов в секунду], однако это кажется чрезвычайно интенсивным для компьютера.На мой взгляд, объем памяти и вычислительные ресурсы, порождаемые несколькими сотнями потоков в Python, являются непомерно высокими.Я чувствую, что должно быть более элегантное решение.
  2. Используйте асинхронную библиотеку Python.Я возился с этим, и это, кажется, действительно круто, но я очень быстро заканчиваю.Если я получаю запросы размером около 140 байтов, то он способен выбрасывать> 1000 запросов в секунду [потрясающе!], Но мне нужно, чтобы он мог обрабатывать запросы, когда ответ значительно больше [т.е. 100–500 кБ].Введение большего размера ответа означает, что он душит около 10-50 запросов в секунду [если мне повезет].

У кого-нибудь есть какие-либо идеи или предложения?Если бы я мог каким-то образом получить размер ответа, не заставляя его прочесть, это было бы идеально.Все, что я хочу знать, это то, что я на самом деле получаю правильное количество байтов.Что это за данные, не имеет значения.

Или, если это не вариант в Python, то, честно говоря, я бы попробовал все, что кто-либо может предложить.Я играл с Twister, но не достиг скорости, превышающей ту, которую я уже видел с потоками.

В любом случае - любая помощь будет отличной.Спасибо!

Ответы [ 2 ]

4 голосов
/ 28 июля 2011

Предлагаю попробовать gevent . Он может выполнить эту задачу очень просто, потому что вы пишете код, который выглядит синхронно и использует python stdlib, например urllib2. Это будет очень быстро, потому что у него низкие накладные расходы памяти (платите только за то, что вы используете), и он использует системные вызовы быстрого опроса для ввода-вывода. Этот пример кода очень близок к тому, что вы хотите. Вы захотите запустить одного работника gevent на ядро.

0 голосов
/ 28 июля 2011

Я предлагаю вам использовать pycurl, привязки Python для libcurl. У него есть собственный цикл асинхронных событий, который очень быстрый.

Существует также упрощенная оболочка для реализации, которую вы можете адаптировать, если не можете использовать ее как есть.

См. Модуль WWW.client проекта Pycopia (который я поддерживаю).

...