Скорость скачивания с мира в dc.utel.ua Халтурка не нужна?=)

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 коннектах).

Переход у нас получается затянутым, но по-другому в условиях тотального дефицита комплектующих (особенно винтов), боюсь не выйдет.

Комментарии (36) на запись “nginx+linux=suxxx”

  1. Vadim Voituk пишет:

    Полезная заметка, хотя сам никогда на линуксе nginx не пробовал - никогда не подумал бы что так туго будет с epoll.
    А вот программный рейд - это зло, и линукс тут непричем :)

  2. Petruk пишет:

    “практика другого ресурса показала, что замена простых винтов на систему с более емкими винтами и крутыми аппаратными рейдами.. замедлила производительность в 1.5-2 раза на таких-же задачах, как у нас.”

    на аппаратном рейде в 1.5-2 упала производительность…да быть того не может…или вовсе не аппаратный был…или так отсетапили…
    какой использовался контроллер, какой уровень рейда, какие винты ?

  3. Andrew пишет:

    Программный рейд не зло, он мало отличаетс по производительности от аппаратного (ну если процессор на машине нормальный). Есть только небольшая часть операций, где будет заметна какая-то разница из-за встроенного кеша контроллера, который общается с винтом не используя шину. И чем дальше, тем эта разница все меньше.
    Сравнительно низкая производительность рейда на подобных файловых серверах обусловливается другим. А имеено - при большом количестве потоков скачивания с большой скоростью, при работе с рейдом, задержки каждого винта тормозят работу рейда в целом. Задержки из-за перемещения головок, потому что при чтении файлов с рейда работают все винты, следовательно, если качаются 4 файла, то каждому винту надо бегать по всех поверхности и считывать куски каждого файла. Тогда как в случае с разными винтами, на которых лежат файлы, каждый винт читает только один файл, соотвественно меньше бегает. В итоге, в условиях, когда одновременно читаются 1К файлов, и нам надо прочитать один файл с рейда, мы читаем кусочек файла (по длине равному chunk) и ждем пока следующий кусочек прочитается с другого винта. Для этого другому винту надо сначала спозиционировать головку на нужный сектор и потом только прочитать. Вот из-за этих позиционирований и выходят задержки. Из-за того, что рейду, в условиях большого количества параллельных считываний, приходится чаще дергать винты. По крайней мере такая моя теория на данный момент.

    Касательно модели рейда и винтов, то винты вроде как hitachi 32Mb cache, модель рейда не знаю, по-моему HighPoint какой-то на 16 винтов. Но надо уточнить..

  4. Draal пишет:

    По поводу linux и nginx, наблюдал туже проблему с необходимостью увеличивать количество worker процесов, дальше выставил: sendfile off,
    и всего 25 воркеров…
    пока полет нормальный,
    на 4-х вениках Active connections: 896
    на 16-ти вениках Active connections: 1501
    отдача пока без проблем…..

  5. Andrew пишет:

    А скорость отдачи с сервера какая при этом? Непремиум сервер с 14винтами нормально держал 1600 (кстати включенный sendfile+куча воркеров на больших нагрузках таки лучше чем несколько воркеров и без sendfile на большом количестве коннектов и скорости). Только суммарная скорость с него была не более 400Мбит/c.. А если лимит скорости снять, то больше 350 не вытягивает (закачки начинают захлебываться).
    Новый сервер на freebsd без рейда вчера 800 выжимал, сегодня пока что 730 идет стабильно (к вечеру нагрузка повышается).

  6. Draal пишет:

    Около 200Мбит на каждом
    для 4-х веникового это максимум, для 16-ти пока больше не просили… на обоих стоят хардовые рейды
    буду дальше тестить ж)

  7. Andrew пишет:

    Есть мнение, что 4х винтовый тоже может больше. На системе подобной той, что стоит на новом сервере. Правда при использовании не nginx, а bandit - веб-сервера, что Бимер писал для инфостора и banner.kiev.ua.
    2 отличия от nginx:
    1. (важно скорее для экономии памяти), размер буффера для отдачи файла выделяется динамически в зависимости от скорости скачивания. Так модемщику не будет выделяться 8Мб (которые он все равно будет полчаса выкачивать) и памяти.
    2. Важно для скорости отдачи. Один процесс (или поток - ХЗ) вешается на один винт в системе. Так, если один винт будет загибаться, то это не окажет влияния на остальные процессы и с остальных винтов будет качаться все равно нормально. Тогда как в случае малого количество процессов в nginx вполне вероятна ситуация когда отдача всем юзерам тормозится, потому что nginx очень долго стоит и ждет винт (при этом пока ожидается блок данных с винта остальные закачки тоже стоят), тогда как бандит отдает нормально, забивая полностью гигабит 14ю винтами по 320Гб (из которых половина АТА еще)

  8. Draal пишет:

    А где можно этот bandit, почитать, посмотреть?

  9. Andrew пишет:

    Нигде. Попробовать можно покачав файл с инфостора или посмотрев баннер УБС;)

  10. Andrey пишет:

    А какого типа рейд был? Чистое зеркало или что-то в духе 5?

  11. Andrew пишет:

    raid0 - страйп.

  12. maserg пишет:

    а это кто-нибудь пробывал?
    http://0w.ru/httpd/

  13. Andrew пишет:

    Я пробовал в начале лета. Сдох где-то на 200 коннектах..

  14. Трошки про nginx та те Linux « GrAndSE’s blog пишет:

    […] те Linux Сьогодні, гортаючи сторінки Google наштовхнувся в одному блозі на недолік, що стосується одного як на мене чудового сервера nginx […]

  15. Алексей пишет:

    Уважаемый Андрей, а какой уровень RAID у вас на сервере?

  16. Andrew пишет:

    1+0 на одном. На остальных рейдов нет.

  17. Алексей пишет:

    Извините, но у меня нескромный вопрос: вы говорите что премиум-доступ и реклама не приносит достаточного дохода ресурсу - каким же образом вы поддерживаете рентабельность?

  18. Andrew пишет:

    Где говорил? По-отдельности - может быть, вместе вполне окупается.

  19. Алексей пишет:

    Расскажите, пожалуйста, с чего вы начинали.

  20. Andrew пишет:

    С арендованного сервера с винтом на 250Гб в ДЦ Воли..

  21. Алексей пишет:

    Вы программист?

  22. Andrew пишет:

    Программист и не только программист. Я еще занимаюсь продвижением (не SEO), продажей рекламы и много-много чем;) По сути нет в этом проекте вещей которым бы я не занимался (это не значит что я все делаю один).

    У меня будет к вам просьба, если есть какие-то вопросы, то выложите их все сразу, я на них сразу и отвечу, так будет удобнее и мне и вам;)

  23. Алексей пишет:

    Спасибо. Их хватит на небольшое интервью, вот они:
    1. Сколько вам лет?
    2. Кто вы по образованию?
    3. Кем вы работали до начала работы в Fileshare?
    4. Тяжело было начинать?
    5. Каким видите будущее сервисов файл-хостинга?
    6. Дата-центр какого провайдера на ваш взгляд лучше всего и почему?
    7. Сколько времени вы посвящаете работе над Fileshare?
    8. Какими функциями Fileshare обладатели премиум-доступа пользуются чаще всего?

    У меня будут ещё вопросы, с вашего позволения.

  24. Алексей пишет:

    Вот ещё вопросы:
    1. Над Fileshare работают много людей?
    2. Как вы относитесь к претензиям со стороны компаний-правообладателей лицензионного материала к файл-хостинг ресурсам?
    3. Не хотите обзавестись собственным 10-гигабитным портом в UA-IX?

  25. Andrew пишет:

    1. 22
    2. программист (хотя формально образования у меня нет так как я ушел после 4го курса)
    3. Грубо говоря программистом (не кодером;)
    4. наверное, раз начали то не слишком тяжело
    5. их будет много, тем больше, чем лучше условия будут в ДЦ Украины (если вопрос был про украинские хостинги)
    6. Свои впечатления от разных ДЦ я описывал в это блоге (можно почитать тут http://forum.fileshare.in.ua/index.php/board,5.0.html если не охота рыться по архиву блога)
    7. все рабочее время (разве что кроме того времени которое уделается разработке новых проектов), сложно сказать сколько именно. Бывает час в день, бывает несколько дней по 10 часов.
    8. Видимо возможностью комфортно и быстро скачивать файлы. Других возможностей особенно не предоставляется;) но это самое гланое..
    А можно узнать какая цель вопросов?

  26. Алексей пишет:

    Конечно можно - я думаю над открытием своего собственного сервера :-) .

  27. Andrew пишет:

    1. сейчас 7, хотя непосредственно над проектом только 2, пока этого достаточно. Раньше было больше.
    2. Отношусь плохо. Но просим подтверждение законнсти жалобы и удовлетворяем ее. Плохо потому что приходится удалять файлы, которые кто-то может качать.
    3. Сам по себе порт ничего не даст. А все что нужно стоит достаточно дорого чтобы пока об этом не думать (до 100К$)

  28. Роман пишет:

    Алексей правильно делаете, что думаете, вот я сначала, открыл и делаю свой файлообменник, и только потом нашел этот блог и прозрел, с того количества нюансов которые мне незнакомы, Андрей даже тестил мой сервис и… работать и работать над ним еще, кстати я всегда открыт к сотрудничеству :)

  29. Алексей пишет:

    Роман,

    Вы находитесь в России, насколько я понимаю, а я - в Украине. Расскажите про свой сервис, пожалуйста, про то, как вы начинали, что нужно на каких ошибках учились - словом, расскажите как можно больше, пожалуйста :-) .

  30. Алексей пишет:

    Андрей, расскажите, когда к вам пришел ваш первый клиент?

  31. Andrew пишет:

    Какой именно клиент? Который получил что?
    Не обижайтесь но ваши вопросы похожи на интервью для школьной газеты;) Какие-то шаблонные все и неясно чем они вообще могут кому-то помочь..

  32. Алексей пишет:

    Клиент, который деньги вам заплатил за премиум :) .

  33. Andrew пишет:

    В день запуска премиумов. Человек 100 купило.. Ресурс к тому времени был достаточно посещаемым.

  34. Роман пишет:

    Алексей я нахожусь тоже в Украине, а точнее в Харькове. а почитать можете в моем блоге. Мне уже неудобно перед Андреем :) И так за счет его блога пиарюсь ))

  35. dmitriy пишет:

    Привет Дрон это Кузькин. мощььььь что действительно порядка 16тыс строк составляют сайт.

  36. generik пишет:

    Очень приятно знать что FreeBSD не такая и далекая система =)

Оставить комментарий