2. ПРОБЛЕМА
• server-side на python: REST JSON API
• nginx, apache2+mod_wsgi в prefork
• MySQL/InnoDB
• bottle.py
• chef+fabric
• nagios+NewRelic
• Jenkins CI
5. ЗАДАЧА
• раз в сутки стартуем perftest-кластер из Jenkins
• разворачиваем окружение, chef
• заливаем последний билд, fabric
• тестируем производительность
• снимаем и публикуем метрики
• убиваем кластер чтобы не тратить деньги
7. РЕШЕНИЕ: вариант
• нужен tool на Python
• у нас есть функциональные тесты
• хотелось бы использовать их для perftest
• NetworkIO-bound workload
• нужен Async-tool
• Twisted, Tornado?
8. РЕШЕНИЕ: gevent!
• cooperative-сокеты в green-тредах
• запускаем N green-тредов с func-tests
• без! доработки в callback-стиле
• получаем MAX утилизацию сети с MIN CPU,MEM
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. РЕЗУЛЬТАТ
• 5K req/s с одного t1.micro за пару центов в час
• тестирование производительности каждый день
• автоматизировано через Jenkins, chef, fabric
• используем стандартные функциональные тесты
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/