2015-07-14 2 views
1

У меня возникли проблемы с плохой отзывчивостью в приложении Django, которые я не знаю, как объяснить. Я использую Nginx, uWSGI Django 1.7 и Python3.4 в среде Cent Os dev. Также есть пара интенсивных потоков процессора, которые периодически выполняют некоторые задачи (вычисления, операции Db, сетевой ввод-вывод). С большой задачей справиться, я замечаю, что загрузка процессора возрастает до 100% за некоторое время. При высоком использовании ЦП каждый запрос Django занимает много времени, что может быть связано даже с тайм-аутом из-за Nginx.Ручка Django низкая отзывчивость

Что мне трудно понять, почему поток Django, обрабатывающий запрос, получает такой маленький кусочек процессора? Это почти так же, как фоновые задачи завышают процессор, в то время как другие потоки получают только остатки.

Учитывая высокую нагрузку на процессор, какой механизм/параметры доступны для работы Django?

ответ

1

Похоже, вам нужно настроить приоритет планирования фоновых операций. Если вы не знакомы с этим термином, вот основная идея: для запуска многих процессов ваша операционная система должна разделить процессорное время на небольшие фрагменты и назначить каждому запущенному процессу срез. Каждый раз, когда заканчивается «временной срез», ОС выбирает новый процесс для запуска в следующем фрагменте времени. Этот выбор называется планированием ЦП, и это происходит много раз в секунду.

Большинство операционных систем позволяют вам настроить приоритет процесса. По сути, он дает ОС «подсказку» о том, что она должна планировать процесс более или менее часто, в отношении других запущенных процессов. Linux позволяет вам настроить приоритет процесса, установив его «приятное» значение. Хорошие значения варьируются от -20 (самый высокий приоритет/чаще всего) до 19 или 20 (самый низкий приоритет). (Это отчасти от того, что вы ожидаете).

Вы можете установить хорошее значение процесса несколькими способами. Когда вы запустите его, вы можете запустить его следующим образом: nice -n [value] [program name]. Если процесс уже запущен, вы можете запустить renice -n [value] [pid], где pid - это идентификатор процесса. Процесс может также настроить свое собственное значение с помощью системного вызова nice(3).

Таким образом, при всем этом в виду, что вы хотите сделать одну этих вещей:

  • Увеличить приоритет (понизить хороший значение) ваших процессов, которые должны реагировать (т.е. Nginx, uwsgi, django).
  • Уменьшить приоритет (увеличить приятное значение) фоновых процессов (например, вычисления, индексирование базы данных и т. Д.).

Более чистая вещь, которую нужно сделать, будет уменьшать приоритет ваших фоновых процессов, поскольку, вероятно, будет меньше тех, что «реагируют» на процессы. Если фоновые процессы находятся в Python, они могут использовать функцию os.nice() для настройки своего собственного приоритета. В противном случае программа может иметь параметр конфигурации, чтобы указать хорошее значение. Если ни одна из этих работ не будет выполнена, вам нужно будет только renice, и вам придется делать это каждый раз при перезагрузке.

Конечно, если вы хотите, вы можете также повысить приоритет Nginx по adjusting the configuration, uWSGI (я не знаю, как - может быть конфигурация, в противном случае renice), и ваше приложение Django (вероятно, с os.renice()) ,

Что бы вы ни делали, держать в виду следующее:

  • Вам необходимо корень повысить приоритет (уменьшить хороший), но не делать противоположное. Это еще один момент в пользу уменьшения приоритета фоновых процессов.
  • Не заходите за борт с хорошими значениями! Вы можете посмотреть различные приятные значения процессов, запущенных в вашей системе, используя top или htop (это столбец «NI»). Вам просто нужно установить числа, чтобы процесс, который вы хотите запускать более часто, немного ниже хорошего значения, чем другой.

Надеюсь, это все поможет. Более подробная информация доступна на страницах вашего руководства: nice(1), renice(1), nice(3), sched(7). Или Google для «linux nice» или чего-то подобного. Повеселись!

+0

Я думаю, что могу использовать следующее: «Увеличьте приоритет (снижайте приятное значение) ваших процессов, которые должны быть отзывчивыми (например, nginx, uwsgi, django)». Другой вариант не применим, поскольку фоновая задача - это python потоки, выполняемые в приложении Danjo. – steve

+0

FYI. Я бы рекомендовал разделить потоки фона на другой процесс, потому что интерпретатор Python имеет глобальную блокировку Interpreter, поэтому интенсивные потоки с использованием вычислений могут по-прежнему влиять на приложение Django. – brenns10

Смежные вопросы