Как оптимизировать (отложить?) запись в большое количество файлов одновременно?
Подскажите пожалуйста есть ли программно-системное решение данной проблемы.
Есть выделенный сервер. На нем запускается 1000+ "демонов", которые получают данные по HTTP и складывают в файлы.
Важна скорость получения данных (стабильность частоты запросов), актуальность данных в файлах не важна (они обрабатываются потом), т.е. данные в файлах могут появляться "пачками", с задержкой, как угодно, лишь бы не пропали.
В пиковые часы, когда количество демонов достигает определенного значения, load average сервера поднимается выше 100-200%. При этом процессор/память загружены на 10-20%. Т.е. проблема в I/O. При этом страдает стабильность запросов.
Можно как-то настроить систему, применить какое-то кеширование, чтобы запись в файлы не блокировала сервер?
Программно решал и на c++, и на php, и на node.js - везде упирается в I/O.
Или вопрос можно решить только несколькими дисками, желательно SSD?
Может писать сначала в БД, а потом уже из бд в файлы?
Некоторые базы данных, например монго, имеют из коробки что-то вроде кэширования.
Вот статья, из которой я копирую данные ниже:
По возможности, MongoDB старается держать все данные в оперативной памяти и сбрасывает изменённые данные на диск каждые 60 секунд. MongoDB позволяет управлять как синхронизацей с диском, так и блокировкой на время выполнения запроса.
Хм, всегда думал, что БД медленнее пишет на диск. А что будет с MongoDB и тем более с сервером, если за 60 секунд придет данных больше, чем свободной памяти?
Сергей Савостин: я не знаю, вероятно начнет работать файл подкачки, в этом случае не уверен, что данные писаться будут сильно быстрее, чем сразу в файл. Но эти 60 секунд настраиваются тоже, как я понимаю.
Сергей Савостин: Я хотел сказать ,что запись в файл то будет идти ровно столько же, сколько бд будет писат ьв файл, чудес не бывает же, просто монго хранит их в оперативке до записи, в связи с чем может организоваться некое кэширование, буфер, что возможно позволит сократить нагрузки на одновременную запись на диск, без потери данных. Но не уверен.
а что произойдет если пиковая нагрузка сохранится за пределами отведенного времени? у вас забита память ... бедный диск сдыхает от бешенного вала информации что в него льется и возникает потеря информации. так может не стоит насиловать оборудование и установить какие-то предельные значения для вхождения ... после которого тупо будет отбрасываться всё? чудес реально не бывает
можно тупо попытаться реализовать очередность. и повысить информативность клиента на той стороне. он получает приблизительный обратный отсчет и номер по очереди. если вдруг данные идут от человека. сложно оперировать оптимизацией не обладая информацией о конечно продукте.
либо реализовать очередность отправки данных на стороне клиента. пусть он кеширует данные.