Здравствуйте, WolfHound, Вы писали:
C>>Файловая система тесно интегрирована с ядерным менеджером кэша и системой виртуальной памяти. Т.е. фичи типа sendfile могут работать очень быстро. WH>1)Что мешает тоже самое сделать с SQL сервером?
Ничего особого. В теории.
WH>2)В правильных ОС фичи типа sendfile не нужны ибо они будут получатся автоматически.
Каким образом?
WH>ОСь аля сингулярити. Следи за руками: WH>1)Приложение SQL среверу: Дай мне вон тот блоб на пару гигов. WH>2)SQL сревер файловой системе: Заверни кусок того файла от сих до сих в поток. WH>3)Файловая система драйверу винта: Вот тебе поток сложи в него такие то блоки. WH>4)Файловая система SQL среверу: держи поток. WH>5)SQL сревер приложению: держи поток. WH>6)Приложение сетевому соединению: Отправь поток.
Мимо. Сетевому драйверу просто любой поток не подойдёт. Хотя бы потому, что в теории он может отдавать по байту в час, а нам нужна сразу как можно большая непрерывная область — чтоб можно было отдать её контроллеру DMA и забыть о ней.
Далее, как поток у нас будет информацию отдавать? Кто будет буффер для них распределять?
Далее, чтоб отдать область напрямую контроллеру DMA — нужно чтобы все фрагменты были выровнены по границе страницы. А на время траснфера нужно ещё блокировать все эти страницы в физической памяти.
Линукс сейчас всё это делает, из-за чего возможно отдавать файлы из кэша прямо в сеть с нулевыми затратами. Буквально драйверу говорят "вот этот, этот и ещё вот этот блок отправить вот туда вот", драйвер как ему там нужно программирует сетевуху, запускает DMA и всё. Благодаря TCP offloading сейчас карточки вообще всё сами могут делать.
На Ethernet'е на это ещё всё можно наплевать, сейчас пара гигабит копирования процессоры не очень затруднит. А вот на FibreChannel или InfiniBand этот overhead уже весьма и весьма заметен.