nginx+linux=suxxx
Пост будет о том, как повысить эффективность файловых серверов.
Сейчас Файлшара переживает достаточно муторный переход на новую систему (муторность связана с тем, что была запланирована закупка еще 4х серверов, но в Киеве пропали практически все комплектующие, еще удалось наскребти девайсов на один сервер). Бывало, что с премиум-сервера файлы отдавались очень плохо, скорость была порядка 100Кб и вообще было достаточно кисло.
Проблема в том, что из-за особенностей старой системы на файлшаре так вышло, что все новые файлы долгое время складировались на один сервер. Сама машина достаточно хорошая (14*500Гб/4Gb RAM), но большое количество скачиваний с неограниченной скоростью ее просто убивало. Проблема решилась достаточно костыльным способом - просто 1.5 терабайта новых файлов была перемещена на другие сервера, а взамен были перемещены старые файлы с других серверов. Тем не менее захотелось узнать, почему это машина с 14ю винтами не смогла потянуть нагрузку.
Проблемы начинали возникать примерно на 500 одновременных скачиваниях с сервера. Ресурсы в которые упиралось все - непосредственно винты (точнее программный рейд) и сам nginx, который мы используем для раздачи.
Скажу сразу, чтобы заставить nginx держать большое количество подключений в линуксе, пришлось заставить его запускать 1000-1500 дочерних процессов (воркеров). По-другому, проседания в виде залипания закачек и очень долгого старта, наблюдаются уже при 300 коннектах и ничем не лечатся. При 1000 и больше процессов проседания начинаются тогда, когда наблюдаются проблемы со скоростью дисковой подсистемы (так, непремиум сервер нормально держит 1000-1200 закачек за счет порезаной скорости).
Первым делом увеличили количество воркеров. Но их и там было много, особого эффекта небыло. Во вторую очередь решили проверить дисковую подсистему. Оказалось что программный (и не только, но об это позже) рейд работает поразительно медленно. Если скорость с одного винта достигает 70Мб/c, то со всего рейда она держится на уровне 160-170Мб и все (и это на 14 винтах!). Проверяли с помощью dd, считывая /dev/sda..sdo b /dev/md1 в /dev/null (т.е. влияние пропускной способности сети исключалось.. в шину тоже не убирались, так как только 4 винта были подключены по pci, остальные либо в мать, либо в pci-ex контроллеры.
Так, как дело было не только в низкой скорости, но и в залипаниях и долгом старте скачивания, то решили, что виноват не только рейд, но и сам nginx. Как известно, проектировался он изначально под freebsd и kqueue, а под линух и epoll уже был просто портирован. На практике отзывы говорили о том, что под фрей он действительно работает лучше.
Было решено поставить фрю и попробовать. Так-же было решено не делать рейда, а раздавать файлы просто с отдельных винтов. На это было 2 причины:
- фря не держит нормально софтовых рейдов.
- практика другого ресурса показала, что замена простых винтов на систему с более емкими винтами и крутыми аппаратными рейдами.. замедлила производительность в 1.5-2 раза на таких-же задачах, как у нас.
Собственно поигравшись с фрей и настроив на ней все, я спопировал все файлы с того сервера, который проседал и запустил на него людей. При чем как премиум-скачивания, так и обычные.
С момента запуска прошло часов 10, количество коннектов напрямую приблизилось к 1000 и самое время было сравнивать работу сервера с таким-же но на линухе и с программным рейдом. Собственно, разница меня даже удивила. При 1000 коннектах, сервер нормально отдает файлы на скорость 3-4Мбайта/c (а может и больше, мой интернет днем больше не позволяет разгоняться), закачка стартует мгновенно.
Кроме того, раньше скачивания контролированись связкой php+apache. nginx вызывал apache как свой бэкэнд, тот обрабатывал запрос и делал x-accel-redirect на нужный файл. При этом еще и делался запрос к базе.
Теперь от этой связки избавились. Все нужные параметры для скачивания передаются непосредственно в url (подменять даже не пытайтесь, антилич там хороший=), а получение пути к файлу на диске осуществляется скриптом на встроенном в nginx перле.
Мы решили не менять количество воркеров и оставили их равным 1500, кое какие твики были взяты с руководства Сысоева по настройке nginx для большого количества коннектов (как раз для фри они подходили, а вот для линуха - нет).
Кстати схему с перловым скриптом в качестве котроллера скачиваний (вместо apache+php) применили так-же и на линуховом сервере. Не помогло.
В общем совет всем: если хотите раздавать файлы через nginx, то не делайте этого под линухом и избегайте для таких задач рейдов (если он не нужен для чего-то еще, кроме раздачи).
Сейчас файлшаровские сервера переводятся на FreeBSD, но один из серверов будет оставаться под линухом (из-за необходимости на нем рейда). Там будет хороший шанс проверить как дела у конкурента nginx - lighttpd 1.5. Как только сервер будет запущен в продакшн, я опишу отзывы об этом веб-сервера и том, как он себя ведет под нагрузкой (к слову - 1.4 в свое время был протестирован и отброшен так, как начинал клинить закачки уже при 200 коннектах).
Переход у нас получается затянутым, но по-другому в условиях тотального дефицита комплектующих (особенно винтов), боюсь не выйдет.
12.02.2008 в 10:22
Полезная заметка, хотя сам никогда на линуксе nginx не пробовал - никогда не подумал бы что так туго будет с epoll.
А вот программный рейд - это зло, и линукс тут непричем :)
12.02.2008 в 14:21
“практика другого ресурса показала, что замена простых винтов на систему с более емкими винтами и крутыми аппаратными рейдами.. замедлила производительность в 1.5-2 раза на таких-же задачах, как у нас.”
на аппаратном рейде в 1.5-2 упала производительность…да быть того не может…или вовсе не аппаратный был…или так отсетапили…
какой использовался контроллер, какой уровень рейда, какие винты ?
12.02.2008 в 14:46
Программный рейд не зло, он мало отличаетс по производительности от аппаратного (ну если процессор на машине нормальный). Есть только небольшая часть операций, где будет заметна какая-то разница из-за встроенного кеша контроллера, который общается с винтом не используя шину. И чем дальше, тем эта разница все меньше.
Сравнительно низкая производительность рейда на подобных файловых серверах обусловливается другим. А имеено - при большом количестве потоков скачивания с большой скоростью, при работе с рейдом, задержки каждого винта тормозят работу рейда в целом. Задержки из-за перемещения головок, потому что при чтении файлов с рейда работают все винты, следовательно, если качаются 4 файла, то каждому винту надо бегать по всех поверхности и считывать куски каждого файла. Тогда как в случае с разными винтами, на которых лежат файлы, каждый винт читает только один файл, соотвественно меньше бегает. В итоге, в условиях, когда одновременно читаются 1К файлов, и нам надо прочитать один файл с рейда, мы читаем кусочек файла (по длине равному chunk) и ждем пока следующий кусочек прочитается с другого винта. Для этого другому винту надо сначала спозиционировать головку на нужный сектор и потом только прочитать. Вот из-за этих позиционирований и выходят задержки. Из-за того, что рейду, в условиях большого количества параллельных считываний, приходится чаще дергать винты. По крайней мере такая моя теория на данный момент.
Касательно модели рейда и винтов, то винты вроде как hitachi 32Mb cache, модель рейда не знаю, по-моему HighPoint какой-то на 16 винтов. Но надо уточнить..
12.02.2008 в 15:24
По поводу linux и nginx, наблюдал туже проблему с необходимостью увеличивать количество worker процесов, дальше выставил: sendfile off,
и всего 25 воркеров…
пока полет нормальный,
на 4-х вениках Active connections: 896
на 16-ти вениках Active connections: 1501
отдача пока без проблем…..
12.02.2008 в 16:47
А скорость отдачи с сервера какая при этом? Непремиум сервер с 14винтами нормально держал 1600 (кстати включенный sendfile+куча воркеров на больших нагрузках таки лучше чем несколько воркеров и без sendfile на большом количестве коннектов и скорости). Только суммарная скорость с него была не более 400Мбит/c.. А если лимит скорости снять, то больше 350 не вытягивает (закачки начинают захлебываться).
Новый сервер на freebsd без рейда вчера 800 выжимал, сегодня пока что 730 идет стабильно (к вечеру нагрузка повышается).
12.02.2008 в 16:59
Около 200Мбит на каждом
для 4-х веникового это максимум, для 16-ти пока больше не просили… на обоих стоят хардовые рейды
буду дальше тестить ж)
12.02.2008 в 17:14
Есть мнение, что 4х винтовый тоже может больше. На системе подобной той, что стоит на новом сервере. Правда при использовании не nginx, а bandit - веб-сервера, что Бимер писал для инфостора и banner.kiev.ua.
2 отличия от nginx:
1. (важно скорее для экономии памяти), размер буффера для отдачи файла выделяется динамически в зависимости от скорости скачивания. Так модемщику не будет выделяться 8Мб (которые он все равно будет полчаса выкачивать) и памяти.
2. Важно для скорости отдачи. Один процесс (или поток - ХЗ) вешается на один винт в системе. Так, если один винт будет загибаться, то это не окажет влияния на остальные процессы и с остальных винтов будет качаться все равно нормально. Тогда как в случае малого количество процессов в nginx вполне вероятна ситуация когда отдача всем юзерам тормозится, потому что nginx очень долго стоит и ждет винт (при этом пока ожидается блок данных с винта остальные закачки тоже стоят), тогда как бандит отдает нормально, забивая полностью гигабит 14ю винтами по 320Гб (из которых половина АТА еще)
12.02.2008 в 18:19
А где можно этот bandit, почитать, посмотреть?
12.02.2008 в 20:55
Нигде. Попробовать можно покачав файл с инфостора или посмотрев баннер УБС;)
14.02.2008 в 11:06
А какого типа рейд был? Чистое зеркало или что-то в духе 5?
14.02.2008 в 12:53
raid0 - страйп.
15.02.2008 в 04:26
а это кто-нибудь пробывал?
http://0w.ru/httpd/
15.02.2008 в 21:57
Я пробовал в начале лета. Сдох где-то на 200 коннектах..
12.04.2008 в 02:35
[…] те Linux Сьогодні, гортаючи сторінки Google наштовхнувся в одному блозі на недолік, що стосується одного як на мене чудового сервера nginx […]
05.07.2008 в 14:45
Уважаемый Андрей, а какой уровень RAID у вас на сервере?
05.07.2008 в 14:47
1+0 на одном. На остальных рейдов нет.
05.07.2008 в 14:55
Извините, но у меня нескромный вопрос: вы говорите что премиум-доступ и реклама не приносит достаточного дохода ресурсу - каким же образом вы поддерживаете рентабельность?
05.07.2008 в 14:59
Где говорил? По-отдельности - может быть, вместе вполне окупается.
05.07.2008 в 15:22
Расскажите, пожалуйста, с чего вы начинали.
05.07.2008 в 15:25
С арендованного сервера с винтом на 250Гб в ДЦ Воли..
05.07.2008 в 15:37
Вы программист?
05.07.2008 в 15:40
Программист и не только программист. Я еще занимаюсь продвижением (не SEO), продажей рекламы и много-много чем;) По сути нет в этом проекте вещей которым бы я не занимался (это не значит что я все делаю один).
У меня будет к вам просьба, если есть какие-то вопросы, то выложите их все сразу, я на них сразу и отвечу, так будет удобнее и мне и вам;)
05.07.2008 в 16:42
Спасибо. Их хватит на небольшое интервью, вот они:
1. Сколько вам лет?
2. Кто вы по образованию?
3. Кем вы работали до начала работы в Fileshare?
4. Тяжело было начинать?
5. Каким видите будущее сервисов файл-хостинга?
6. Дата-центр какого провайдера на ваш взгляд лучше всего и почему?
7. Сколько времени вы посвящаете работе над Fileshare?
8. Какими функциями Fileshare обладатели премиум-доступа пользуются чаще всего?
У меня будут ещё вопросы, с вашего позволения.
05.07.2008 в 16:58
Вот ещё вопросы:
1. Над Fileshare работают много людей?
2. Как вы относитесь к претензиям со стороны компаний-правообладателей лицензионного материала к файл-хостинг ресурсам?
3. Не хотите обзавестись собственным 10-гигабитным портом в UA-IX?
05.07.2008 в 17:00
1. 22
2. программист (хотя формально образования у меня нет так как я ушел после 4го курса)
3. Грубо говоря программистом (не кодером;)
4. наверное, раз начали то не слишком тяжело
5. их будет много, тем больше, чем лучше условия будут в ДЦ Украины (если вопрос был про украинские хостинги)
6. Свои впечатления от разных ДЦ я описывал в это блоге (можно почитать тут http://forum.fileshare.in.ua/index.php/board,5.0.html если не охота рыться по архиву блога)
7. все рабочее время (разве что кроме того времени которое уделается разработке новых проектов), сложно сказать сколько именно. Бывает час в день, бывает несколько дней по 10 часов.
8. Видимо возможностью комфортно и быстро скачивать файлы. Других возможностей особенно не предоставляется;) но это самое гланое..
А можно узнать какая цель вопросов?
05.07.2008 в 17:03
Конечно можно - я думаю над открытием своего собственного сервера :-) .
05.07.2008 в 17:04
1. сейчас 7, хотя непосредственно над проектом только 2, пока этого достаточно. Раньше было больше.
2. Отношусь плохо. Но просим подтверждение законнсти жалобы и удовлетворяем ее. Плохо потому что приходится удалять файлы, которые кто-то может качать.
3. Сам по себе порт ничего не даст. А все что нужно стоит достаточно дорого чтобы пока об этом не думать (до 100К$)
06.07.2008 в 17:40
Алексей правильно делаете, что думаете, вот я сначала, открыл и делаю свой файлообменник, и только потом нашел этот блог и прозрел, с того количества нюансов которые мне незнакомы, Андрей даже тестил мой сервис и… работать и работать над ним еще, кстати я всегда открыт к сотрудничеству :)
06.07.2008 в 20:46
Роман,
Вы находитесь в России, насколько я понимаю, а я - в Украине. Расскажите про свой сервис, пожалуйста, про то, как вы начинали, что нужно на каких ошибках учились - словом, расскажите как можно больше, пожалуйста :-) .
06.07.2008 в 20:49
Андрей, расскажите, когда к вам пришел ваш первый клиент?
06.07.2008 в 20:56
Какой именно клиент? Который получил что?
Не обижайтесь но ваши вопросы похожи на интервью для школьной газеты;) Какие-то шаблонные все и неясно чем они вообще могут кому-то помочь..
06.07.2008 в 21:00
Клиент, который деньги вам заплатил за премиум :) .
06.07.2008 в 21:04
В день запуска премиумов. Человек 100 купило.. Ресурс к тому времени был достаточно посещаемым.
08.07.2008 в 14:18
Алексей я нахожусь тоже в Украине, а точнее в Харькове. а почитать можете в моем блоге. Мне уже неудобно перед Андреем :) И так за счет его блога пиарюсь ))
20.07.2008 в 19:33
Привет Дрон это Кузькин. мощььььь что действительно порядка 16тыс строк составляют сайт.
18.08.2008 в 15:05
Очень приятно знать что FreeBSD не такая и далекая система =)