Использование gevent для эмуляции высокой нагрузки

831 views

Published on

Автор: Александр Колесень (SiliconMint)

Обязательное действие перед выпуском более-менее серьёзного проекта — тестирование производительности. На высоконагруженных проектах нужно точно знать, какую нагрузку они могут выдержать, причём заранее. Следовательно, нужен способ эмуляции высокой конкурентности, желательно чтобы в теории он позволял полностью загрузить канал траффиком. К тому же, неплохо было бы, чтобы для этого не нужно было использовать несколько десятков серверов. В докладе будет рассказано об опыте использования gevent для подобной задачи, что позволило бы обойтись одним t1.micro инстансом, с которого выполняется тестирование.

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
831
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
12
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Использование gevent для эмуляции высокой нагрузки

  1. 1. gevent для эмуляции нагрузки АЛЕКСАНДР КОЛЕСЕНЬ
  2. 2. ПРОБЛЕМА • server-side на python: REST JSON API • nginx, apache2+mod_wsgi в prefork • MySQL/InnoDB • bottle.py • chef+fabric • nagios+NewRelic • Jenkins CI
  3. 3. ПРОБЛЕМА Выдержит ли slashdot-эффект?
  4. 4. ЗАДАЧА • тестирование производительности • эмуляция “Интернета” • на AWS/EC2 • как можно более дешевле
  5. 5. ЗАДАЧА • раз в сутки стартуем perftest-кластер из Jenkins • разворачиваем окружение, chef • заливаем последний билд, fabric • тестируем производительность • снимаем и публикуем метрики • убиваем кластер чтобы не тратить деньги
  6. 6. РЕШЕНИЕ: вариант • ab, siege? • не очень удобно • хотелось бы запускать из Python
  7. 7. РЕШЕНИЕ: вариант • нужен tool на Python • у нас есть функциональные тесты • хотелось бы использовать их для perftest • NetworkIO-bound workload • нужен Async-tool • Twisted, Tornado?
  8. 8. РЕШЕНИЕ: gevent! • cooperative-сокеты в green-тредах • запускаем N green-тредов с func-tests • без! доработки в callback-стиле • получаем MAX утилизацию сети с MIN CPU,MEM
  9. 9. ДЕТАЛИ: gevent • green-треды • cooperative-сокеты • monkey-patching • работает поверх libev (epoll, kqueue)
  10. 10. ПРИМЕР: gevent from gevent import monkey; monkey.patch_all() def fetch_url(url): while True: data = urllib2.urlopen(url).read() def main(urls): gs = [gevent.spawn(fetch_url, url) for url in urls] gevent.joinall(gs) if __name__ == ’__main__’: print main(["http://google.com/"]*1024)
  11. 11. РЕЗУЛЬТАТ • 5K req/s с одного t1.micro за пару центов в час • тестирование производительности каждый день • автоматизировано через Jenkins, chef, fabric • используем стандартные функциональные тесты
  12. 12. СПАСИБО ЗА ВНИМАНИЕ. ВОПРОСЫ gevent http://www.gevent.org http://twit.tv/show/floss-weekly/238 http://www.youtube.com/watch?v=FITsetDUKJ0 Александр Колесень mailto:alexander.kolesen@gmail.com https://twitter.com/imm0use https://plus.google.com/107935551373006842102/

×