Сориентируйте по производительности

tipnote

Имеется машина:
1) Xeon E3 1230 3.2 GHz (8 Cores With HT) - 1x1000GB HDD - 8192MB RAM
на ней крутится
2) Debian 2.6.32-5-amd64, nginx, gevent, python wsgi-приложение
Приложение занимается приемом данных формы, простейшей regexp-валидацией и записью в лог-файл
по замерам ab с одного ядра (один процесс)
3) обрабатывается около 7000 запросов в секунду
Имеет смысл ковырять дальше или больше не выжму?

pilot

Имеет смысл ковырять дальше или больше не выжму?
Ковырять-то понятно что, вопрос зачем это надо, сколько времени не жалко и т.п.

tipnote

Скажем так, если я уже достиг 80% возможного и дальше я буду оставшиеся 20% получать все более непропорциональным геморроем, то больше не надо. Здесь мне хотелось бы оценить как раз, где я нахожусь. Интерес уже скорее спортивный и исследовательский, потому что заданные мне параметры пиковой нагрузки я обеспечу на этой машине балансировщиком нжинкса и 4-5 процессами-обработчиками

pilot

Дальнейший геморрой имхо выйдет дороже еще одной железки.
У тебя сейчас epoll на epollе, можно написать модуль к nginxу и выпилить питон вовсе. Можно на lua, можно на перле или с++, можно свой костыль вместо нгинкса написать. Наверно еще можно системные настройки ковырять.

vall

потыкай perf, если конечно в диск ты не упёрся. python вполне может стать узким местом.

tipnote

Окей, всем спасибо

pilot

если конечно в диск ты не упёрся
Чойто не понял что такого он должен писать в лог чтоб упереться в диск. :confused:

tipnote

В диск, да, вряд ли. Разве что драйвер какой-нибудь generic вдруг и работает как-то "неоптимально". На вход поступает не более 128*3+4~400 байт. В лог пишется не более 500 байт на запрос. В среднем же раза в три-четыре меньше.

vall

смотря как и куда писать. если логов много и на каждый звать fsync то легко
ещё можно позвать fallocate и саллоцировать много места за концом файла — тогда аппенд будет всегда быстрым.

pilot

Ты с ВМК?

Ivan8209

Если только debi-an не сотворил очередной идиотизм, то затык,
если есть, в этом:
> python wsgi-приложение
Вынеси питон к чёрту и замени его плюсами. Если у тебя
приложение действительно простое, как ты утверждаешь,
это не должно быть сложно.
Проверить пропускную способность диска не настолько сложно: man dd, man time.
Не знаю, как в твоём линуксе, в операционных системах ps(1) и top(1)
дают немного понять, что происходит с процессом. Опять же, если подозреваешь
диск, перенеси файл на mfs и отключи подкачку.
Вообще, если ты ничего не скрыл, проверить пропускную способность твоих подсистем
довольно просто: переделать твой скрипт, чтобы он просто считал число пришедших запросов,
заставить тот же скрипт постоянно писать одно и то же значение в лог, без wsgi,
написать такую же прогу на сях, проверить, сравнить, приделать к ней регулярные выражения,
проверить, сравнить, и т.д. Быстрее будет самому сделать, если это действительно важно.
---
"Истина грядёт --- её ничто не остановит!"

Dasar

заставить тот же скрипт постоянно писать одно и то же значение в лог, без wsgi,
написать такую же прогу на сях, проверить, сравнить, приделать к ней регулярные выражения,
проверить, сравнить, и т.д. Быстрее будет самому сделать, если это действительно важно.
Это долгий путь и он не гарантирует какой-либо достоверности получаемого результата, особенно если постоянно какие-то факторы упускаются (не замечаются).
Лучше двигаться от общих оценок, например, от оценок:
сколько максимум байт в секунду может обработать процессор,
сколько максимум байт в секунду может быть считано/записано в память,
сколько максимум можно байт записать на диск в секунду,
сколько максимум байт в секунду может быть считано с сети и т.д.
Дальше оцениваются эти факторы для своей задачи, рассчитывается, что из этих факторов является определяющим (bottleneck-ом и ищутся причины в следствии которых максимум не был достигнут на определяющих факторах.

Dasar

3) обрабатывается около 7000 запросов в секунду
Чем это значение у тебя сейчас лимитируется?
Процессор загружен на 100%?
Процессы не успевают быстрее переключаться?
что-то еще?

pilot

Вынеси питон к чёрту и замени его плюсами. Если у тебя
приложение действительно простое, как ты утверждаешь,
это не должно быть сложно.
Проверить пропускную способность диска не настолько сложно: man dd, man time.
Не знаю, как в твоём линуксе, в операционных системах ps(1) и top(1)
дают немного понять, что происходит с процессом. Опять же, если подозреваешь
диск, перенеси файл на mfs и отключи подкачку.
Вообще, если ты ничего не скрыл, проверить пропускную способность твоих подсистем
довольно просто: переделать твой скрипт, чтобы он просто считал число пришедших запросов,
заставить тот же скрипт постоянно писать одно и то же значение в лог, без wsgi,
написать такую же прогу на сях, проверить, сравнить, приделать к ней регулярные выражения,
проверить, сравнить, и т.д. Быстрее будет самому сделать, если это действительно важно.
можно написать модуль к nginxу и выпилить питон вовсе. Можно на lua, можно на перле или с++, можно свой костыль вместо нгинкса написать. Наверно еще можно системные настройки ковырять.

vall

я из леса

pilot

Ответ на сообщение
Т.е. угадал правильно, ок.

Ivan8209

На луа навряд ли получится быстрее, чем с питоном,
а вот без питона очень возможно. Причём без костылей,
костыль здесь --- питон.
---
"Истина грядёт --- её ничто не остановит!"

Ivan8209

> Это долгий путь и он не гарантирует какой-либо достоверности
> получаемого результата, особенно если постоянно какие-то факторы
> упускаются (не замечаются).
У тебя, видимо, очень большой опыт таких оптимизаций.
Практика показывет, что даже в относительно несложных случаях
почему-то приходится обращаться именно к этому, а не к "оценкам,"
как ты предлагаешь. А уж здесь это нифига не долгий путь, учитывая
то, как данные перемещаются между компонентами.
> Дальше оцениваются эти факторы для своей задачи, рассчитывается,
> что из этих факторов является определяющим (bottleneck-ом
> и ищутся причины в следствии которых максимум не был достигнут
> на определяющих факторах.
Ты вот здесь расчитал хоть что-нибудь? Данных, вообще-то, достаточно
для первых прикидок.
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."

Dasar

У тебя, видимо, очень большой опыт таких оптимизаций.
да, большой.
Ты вот здесь расчитал хоть что-нибудь? Данных, вообще-то, достаточно для первых прикидок.
В данном случае, используется стек технологий, с которым у меня малый опыт работы, и нет готовых данных по производительности каждого узкого места. Что не позволяет дать однозначный ответ, какое узкое место ограничивает производительность всей задачи, и как это место можно расшить.
Соответственно, я и предложил ТС начать оптимизацию с диагностирования, какое узкое место (из стандартных) ограничивает производительность всей задачи.

Ivan8209

Вот это:
> да, большой.
противоречит вот этому:
> В данном случае, используется стек технологий, с которым у меня малый опыт работы
Не говоря уж о том, что по описанию понятно, что происходит внутри этого "стека технологий."
Тут даже не важно знать, что конкретно используют gevent или nginx, хоть select(2).
А уж вот это:
> и нет готовых данных по производительности каждого узкого места.
вообще весело.
Да, готовых данных нет, и что? Ты оптимизируешь по готовым табличкам?
А если их нет, то как?
> Соответственно, я и предложил ТС начать оптимизацию с диагностирования
Ты написал бред про "оценки" пропускной способности памяти,
процессора и т.д., это не считается диагностированием.
Ежу понятно, что самое большее, что можно из этого выжать,
это оценку сверху, а она никого не интересует. Это то же самое,
что оценивать скорость полёта самолёта исходя из соображений,
что он не может двигаться быстрее скорости света.
---
"Дебилы, несмотря на замедленность и конкретность мышления,
низкий уровень суждений, узкий кругозор, бедный запас слов
и слабую память, способны к приобретению некоторых знаний
и профессиональных навыков."

Dasar

А если их нет, то как?
Строятся по ходу, ничего сложного в этом нет, времени такое построение занимает мало, но при этом резко сокращает время оптимизации каждой конкретной задачи
Ежу понятно, что самое большее, что можно из этого выжать,
это оценку сверху, а она никого не интересует.
если ты или еж не могут выжать большего, то это не означает, что все не могут.

Dasar

Тут даже не важно знать, что конкретно используют gevent или nginx, хоть select(2).
Если у ТС используются regexp-ы с backtracking-ом, то всё это не важно, т.к. основным узким местом будет доступ из процессора к памяти при обработке regexp-ов, а так же само использование алгоритмов backtracking-а

Ivan8209

> Строятся по ходу, ничего сложного в этом нет, времени такое
> построение занимает мало, но при этом резко сокращает время
> оптимизации каждой конкретной задачи
А если они всю равно дают большое расхождение, то что?
Чудо, если ты страдаешь дефицитом внимания, то перечитывай то,
что ты написал. Хотя бы иногда:
DG> Это долгий путь и он не гарантирует какой-либо достоверности
DG> получаемого результата, особенно если постоянно какие-то
DG> факторы упускаются (не замечаются).
Что дадут твои таблицы, если при их построении "постоянно
какие-то факторы упускаются (не замечаются)?"
Например, каким образом ты откроешь, что нужно менять реализацию
сопоставления с регулярными выражениями? Кстати, заодно объясни,
что ты собираешься делать с обычными "безоткатными" регулярными
выражениями, если всё таки упрётся в них.
---
"Quae medicamenta non sanat, ferrum sanat,
quae ferrum non sanat, ignis sanat."

Dasar

А если они всю равно дают большое расхождение, то что?
Значит те таблицы которые ты построил не адекватны решаемым тобой задачам.
> Что дадут твои таблицы, если при их построении "постоянно какие-то факторы упускаются (не замечаются)?"
Потому что при наличие двух оценок: нижней и верхней, с последующим их уточнением и соответствующим сближением одной с другой локализуется упускаемый фактор и точка его присутствия
> Например, каким образом ты откроешь, что нужно менять реализацию сопоставления с регулярными выражениями?
Когда таблица показывает, что есть большие разрывы между тем, что есть, и тем что должно быть.
> Кстати, заодно объясни что ты собираешься делать с обычными "безоткатными" регулярными
выражениями, если всё таки упрётся в них.
Сначала проверю, что оно действительно того стоит, а потом воткну какой-то частный генератор regexp-ов, которая по максимуму использует особенности именно данного набора регулярных выражений и возможности именно данного компьютера.

Ivan8209

>> А если они всю равно дают большое расхождение, то что?
> Значит те таблицы которые ты построил не адекватны решаемым тобой задачам.
Это констатация факта, что делать-то собираешься?
Если ты ещё не понял, поясняю: ты потратил кучу времени на составление таблиц,
которые оказались неадекватны, код приложения при этом не изменился,
то есть производительность не поменялась, никакие альтернативные варианты
ты при этом не проверил.
>> Кстати, заодно объясни что ты собираешься делать с обычными
>> "безоткатными" регулярными выражениями, если всё таки упрётся в них.
> Сначала проверю, что оно действительно того стоит, а потом
> воткну какой-то частный генератор regexp-ов, которая по
> максимуму использует особенности именно данного набора
> регулярных выражений и возможности именного данного
> компьютера.
У тебя же оценка сверху не достигается, значит, оно того стоит,
какой "частный генератор" ты собираешься впихивать (в питон, да)
и, самое главное, почему это займёт меньше времени?
---
"Дебилы, несмотря на замедленность и конкретность мышления,
низкий уровень суждений, узкий кругозор, бедный запас слов
и слабую память, способны к приобретению некоторых знаний
и профессиональных навыков."

Dasar

ты потратил кучу времени на составление таблиц,
я не тратил.
> У тебя же оценка сверху не достигается, значит, оно того стоит,
Это твой вывод, а не мой или чей-то еще.
ТС, например, сразу сказал, что его устраивает 20% разрыв, если его устранение требует серьезных телодвижений.
> какой "частный генератор" ты собираешься впихивать (в питон, да)
и в чем проблема? имеющийся в питоне обработчик regexp-ов явно не на питоне написан.
> и, самое главное, почему это займёт меньше времени?
Потому что будет решаться только та задача, которая требует решения.
Например, если предложенное тобой переписывание на C++ заведомо дает совокупный эффект меньше 15% на задаче ТС, то нафига его тогда делать, исходя из условий ТС?

tipnote

В общем, упирался я в проц (точнее в ядро). Манипуляции с кодом обработчиков практически ничего не приносили, так что действительно либо вообще переписывать на низкоуровневом языке, либо избавляться от звена wsgi. Либо и то и то.
Порадовало, что работа с файлом (даже переоткрывая файл каждый раз) практически не влияет на производительность всей системы в целом.
ЗЫ А что за минусомет по треду прошелся? )

Ivan8209

>> ты потратил кучу времени на составление таблиц,
> я не тратил.
То есть, трудозатраты на составление волшебных табличек ты не учитываешь?
>> У тебя же оценка сверху не достигается, значит, оно того стоит,
> Это твой вывод, а не мой или чей-то еще.
> ТС, например, сразу сказал, что его устраивает 20% разрыв,
> если его устранение требует серьезных телодвижений.
Как ты собираешься установить по табличкам, что оно потребует "серьёзных телодвижений?"
>> какой "частный генератор" ты собираешься впихивать (в питон, да)
> и в чем проблема? имеющийся в питоне обработчик regexp-ов явно не на питоне написан.
Чем и как быстро ты собираешься его заменить?
>> и, самое главное, почему это займёт меньше времени?
> Потому что будет решаться только та задача, которая требует решения.
Задача, вообще-то, стояла увеличить пропускную способность,
а не заменить библиотеку регулярных выражений.
---
"Университет развивает все способности, в том числе и глупость."

Ivan8209

> либо избавляться от звена wsgi.
Если есть время, можно и правда посмотреть, как пишутся модули nginx.
---
"Не надо читать много книг."

Dasar

В общем, упирался я в проц (точнее в ядро). Манипуляции с кодом обработчиков практически ничего не приносили, так что действительно либо вообще переписывать на низкоуровневом языке, либо избавляться от звена wsgi. Либо и то и то.
Если поставить пустой обработчик: без всяких проверок возвращается пустая страница, то как меняется кол-во обработанных запросов, и загрузка процессора?

Dasar

То есть, трудозатраты на составление волшебных табличек ты не учитываешь?
Если таблицу заполнять по требованию, то заполнить требуется только несколько ячеек в направлении изменения кода.
Это занимает много меньше времени, чем само изменение кода.
> Как ты собираешься установить по табличкам, что оно потребует "серьёзных телодвижений?"
Функцию на сколько можно увеличить производительность за какой объем телодвижений, тоже можно представить в табличной форме.

tipnote

количество обработанных вырастает на 2-5%, проц все также в полной загрузке

Dasar

количество обработанных вырастает на 2-5%, проц все также в полной загрузке
Если оставить всё тоже самое, но убрать питон и возвращать пустую страницу без обработки, то как меняются эти же показатели?

tipnote

2кб статику нжинкс отдает на уровне 40000 запросов в секунду, если ты об этом.

Dasar

2кб статику нжинкс отдает на уровне 40000 запросов в секунду, если ты об этом.
а минимальную динамику? например, взять урл как строку и вернуть кол-во букв a в запросе?
Оставить комментарий
Имя или ник:
Комментарий: