Назад | Перейти на главную страницу

Почему мой самба-сервер так медленно обслуживает данные, даже если эти данные кэшированы?

У меня есть сервер CentOS 5.6 с базовой установкой Samba. Он имеет 8-дисковый Raid 5, подключенный к Areca 1880, тесты hdparm вернули мне ~ 450 Мбит / с, и я могу подтвердить это с помощью dd to / dev / null. Для передачи файлов в сеть используется карта Myricom 10 ГБ, а все клиенты - 1 ГБ Broadcom / Intel / и т. Д. На одном коммутаторе.

Проблема, с которой я столкнулся, кажется довольно постоянной: производительность копирования файлов с одним потоком оставляет желать лучшего, если файлы не были кэшированы в память на сервере. Я говорю о файлах размером 9-12 МБ, если я копирую файл размером 1 ГБ, производительность зашкаливает, обычно 90% + на клиентах 1 ГБ. Когда я копирую файлы размером 9–12 МБ, скажем, 100 из них, он будет использовать примерно 40–50%, после того как они будут кэшированы на сервере, он МОЖЕТ БЫТЬ 55–65% использования на клиентской сетевой карте 1 ГБ, но никогда больше. Зачем?!?

Я могу скопировать несколько кэшированных последовательных файловых последовательностей и получить, возможно, более 85% использования на клиентской сетевой карте, почему одна файловая последовательность не может достигать 95% +? Все клиенты настроены на выгрузку пакетов tx / rx на адаптер, к сожалению, они не используют Jumbo Frames, но я тестировал с включенным Jumbos и все еще видел ту же производительность.

Большой последовательный доступ - лучший сценарий, и, как вы говорите, ваша система насыщает канал в этом сценарии.

Использование множества файлов меньшего размера по сравнению с одним большим файлом приводит к появлению метаданных и, возможно, накладных расходов на блокировку. Я предполагаю, что с более чем одним потоком вы получаете несколько передаваемых данных, а в многоядерной системе они могут делать это параллельно, увеличивая пропускную способность. Такое поведение, кажется, указывает на то, что вы ограничены однопоточной производительностью для многих небольших файлов. Если вы можете протестировать с SSD, вы узнаете, связана ли проблема с производительностью с дисковым вводом-выводом (блокировка, изменение времени доступа, метаданные) или ваш процессор привязан (вы также можете увидеть, как процесс самбы пожирает все ядро ​​на top отображать при передаче данных, что было бы хорошим индикатором).

Вы также можете поиграть с SystemTap и посмотреть, где именно ядро ​​тратит время в сценариях «большой файл» и «много маленьких файлов».