вторник, 16 августа 2011 г.

Тормозит Django development server

Django

Буквально ни с того, ни с сего начал жутко тормозить dev-сервер Django. Странички открывались по 5-8 секунд, что было само по себе раздражительным явлением и, кроме этого, очень тормозило разработку.

После первого подхода к гуглению выяснилось, что у некоторых людей dev-сервер тормозил на отдачи статики. Лечится это, по их словам, переносом статики на какой-нибудь взрослый web-сервер. Например, на nginx или даже Apache.

Но firebug помог мне избежать пустой траты времени на настройку дополнительного web-сервера. А именно, на вкладке Net::All было видно, что долго обрабатывается только первый GET-запрос самой странички. Последующие же запросы статики обрабатывались в один миг.

К этому моменту стало понятно, что проблема в MySQL. И это было подтверждено тем, что запрос к БД из python manage.py shell выполнялись с той же 5-8-секундной задержкой.

Следующий найденный вопрос по этой теме имел несколько экзотичное объяснение в ответе. Оказалось, что обращение к dev-серверу через localhost может быть гораздо медленее, чем через 127.0.0.1. По слухам, это связано с тем, что браузер сначала пытается соединиться через IPv6, и только после таймаута по этой попытке делает запрос через IPv4. Насколько это правда судить вам, но у меня обращения через localhost и 127.0.0.1 абсолютно равнозначны по времени.

И, наконец, был найден ответ. Тормозило работу то, что при соединении нового клиента с mysqld, mysqld пробует определить домен клиента по его IP. В дальнейшем домен будет использоватся при выяснении, имеет ли право данный клиент с данного домена на те действия, которые он пытается совершить. Эту функциональность можно отключить, выйграв в скорости, но пожертвовав возможностью указывать в MySQL grant tables доменные имена.

Собственно, выбора тут нет, и, добавив строку skip-name-resolve в конфиг MySQL (в моём случае это /etc/mysql/my.cnf), получаем быстрый и отзывчивый dev-сервер. Автор вопроса пишет также об опции skip-locking, но, во-первых, такой опции у MySQL 5 нет, а, во-вторых, наиболее похожая на неё опция skip-external-locking уже была в конфиге по-умолчанию :)

Подпробнее про то, как MySQL использует DNS тут.

1 комментарий:

  1. Образцы нормативных документов по стандартизации http://mirtesen.ru/people/266465613
    Образцы действующих документов по стандартизации https://metrologu.ru/profile/104916-garina/
    Шаблоны нормативных документов по сертификации https://metrologu.ru/profile/104928-tatalina/
    Примеры действующих документов по стандартизации https://metrologu.ru/profile/104933-panfilova

    ОтветитьУдалить