#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 блоков.