LINUX.ORG.RU

Как сделать Django быстрой?

 ,


1

3

Доброй ночи! Есть сайт nginx+Plack+Mojolicious+MySQL, есть аналогичный на nginx+uWSGI+Django+MySQL. Решил погонять тесты siege (с=100, r=100). Первый показывает 50rps, второй - 7. Железо одно и то же. Запросы к базе оптимизировал, там в районе 5-10 мс.

Понимаю, что должно быть примерно одно и то же по производительности. Может как-то хитро надо конфигурировать Django|uWSGI?

uwsgi.ini:

[uwsgi]
socket = 127.0.0.1:8001
chdir = /path/to/xyz
module = xyz.wsgi:application
master = True
pidfile = /var/run/uwsgi_xyz.pid
processes = 4
threads = 2
uid = xyz
gid = xyz
harakiri = 60
max-requests = 5000
vacuum = True
home = /home/xyz/.virtualenvs/xyz
touch-reload = /home/xyz/reload
buffer-size = 32768
env = DJANGO_SETTINGS_MODULE=xyz.settings.prod
plugins=python


в этом вашем питоне нет банального профайлера чтобы посмотреть где тормозит?

Deleted
()
Ответ на: комментарий от ei-grad

Уже покешил тяжёлые запросы с высоким временем протухания. Осталось 9 запросов на 5 мс.

bug
() автор топика

И конечно же оба приложения выполняют одинаковые запросы к бд?

bj
()

какая версия django?

just for fun попробуй еще gunicorn вместо uwsgi, хотя разница между ними не большая, вряд ли будет заметно

ei-grad ★★★★★
()

джанга на легких вьюшках с парой select/update/insert sql запросов вроде вполне гоняет до 300 RPS на один поток на хорошем железе... основной проблемой раньше была переустановка соединений к БД между HTTP запросами, но это решилось еще с выходом 1.6...

ei-grad ★★★★★
()
Ответ на: комментарий от ei-grad

Про gunicorn мысль была. Пробовать буду. Версия 1.6.5. Думаю, повнимательнее поглядеть на разные сторонние мидлвари, аппы.

bug
() автор топика
Ответ на: комментарий от bug

Persistent connections¶

Persistent connections avoid the overhead of re-establishing a connection to the database in each request. They’re controlled by the CONN_MAX_AGE parameter which defines the maximum lifetime of a connection. It can be set independently for each database.

The default value is 0, preserving the historical behavior of closing the database connection at the end of each request. To enable persistent connections, set CONN_MAX_AGE to a positive number of seconds. For unlimited persistent connections, set it to None.

хм. однако... по дефолту все еще тормоза... они бы еще sleep'ов понавставляли, для совместимости...

ei-grad ★★★★★
()

По умолчанию жанга не кеширует скомпилированные темплейты. Она их на каждый запрос перечитывает с диска и компилирует заново - https://docs.djangoproject.com/en/dev/ref/templates/api/.

вот так сделай:

TEMPLATE_LOADERS = (
('django.template.loaders.cached.Loader', (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
)),
)
shimshimshim
()

Будь мужиком! Включи async! Блеарх!

commit ★★
()
Ответ на: комментарий от shimshimshim

Спасибо! Получил ускорение 20%. Ещё upstream через unix socket сделал, а не inet.

bug
() автор топика
Ответ на: комментарий от Deleted

Видимо, чтобы на деве не перезапускать постоянно.

bug
() автор топика

Попробуй процессов сделать штук 50. 4 мало совсем, они у тебя сто пудов большую часть времени заблокированные висят. Кстати, какая утилизация cpu у тебя? Сперва добейся что бы проц загрузить по полной. Потом уже ищи узкие места.

dizza ★★★★★
()
Ответ на: комментарий от dizza

С числом воркеров и тредов экспериментировал. На одной железке лучше 20, 4. На той, с которой конфиг привёл - 4, 2.

bug
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.