Предполагая, что в коробке Linux есть огромный дисковый кэш, значительно ли повышает производительность приложений буферизация записи?

#linux #performance #caching #disk

Вопрос:

 $ free -wh
              total        used        free      shared     buffers       cache   available
Mem:           125G         30G         59G        1.3G        837M         35G         92G
Swap:          7.6G        700K        7.6G
 

Я понимаю, что приложения могут буферизировать записи на диск по разным причинам, не обязательно для повышения производительности, но при условии, что вы собираетесь записывать полные «записи» 100 раз в секунду, возможно, размером 1 кб, за один вызов функции записи на уровне ОС (эта)

 #include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
 

Должны ли они быть собраны в блоки размером около 4k перед написанием или в этом мало пользы?

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

Действительно ли дисковый кэш Linux «абстрагирует» необходимость того, чтобы приложения выполняли свою собственную буферизацию?

Я знаю, что всегда есть исключения из общих правил, и ваши ответы могут привести к этому, но я говорю в основном о приложениях, которым необходимо записывать файлы последовательного типа журнала, возможно, 100 в секунду.

Комментарии:

1. Для потоков C вы можете попробовать использовать setvbuf, чтобы проверить производительность каждым способом.

2. AFAIK, ОС имеет свой собственный кэш, а также libc. Буферы ОС очень помогают ускорить запись и кэширование данных на жестких дисках или медленных твердотельных накопителях, но не всегда на быстрых твердотельных накопителях Nvme M2. Кэш libc помогает сократить системные вызовы, которые были бы довольно дорогими, особенно для 1k блоков.