У меня есть программное обеспечение для сохранения / извлечения данных из файлов (немного похоже на базу данных, но это не совсем механизм базы данных). Это не открытый исходный код, и документация скудна, поэтому у меня нет точной информации о его внутренней работе. Он производит около 50–100 ГБ данных в день, и я знаю, что он отображает в памяти файл, в который он записывает. Вы должны знать, что есть только один процесс, записывающий в файлы, но есть и другие процессы, которые отображают память файлов (для чтения у них нет прав на запись в данные). Нагрузка на процесс примерно постоянна в течение дня, 50-100G выписывается более мелкими пачками (происходит каждые 10-30 секунд). Следовательно, «средний» объем операций ввода-вывода в течение 8-часового дня должен составлять около 2 МБ / с (что реалистично, поскольку процесс получает данные через 100-мегабитное соединение). Процесс всегда должен добавлять данные, а не удалять их.
Симптом, который я вижу, следующий:
Я знаю, что это все еще очень расплывчатое описание проблемы, но есть ограничение на детали, которые я могу здесь указать, а также потому, что программное обеспечение представляет собой черный ящик, я не могу получить больше информации о том, что оно делает.
Кто-нибудь знает, что может вызвать это чрезвычайно высокое значение cancelled_write_bytes? Все, что я обнаружил, это то, что он высокий, когда процесс записывает в файл, а затем удаляет его.
Спасибо.
Да, разобрался. Он решает проблему параллелизма, устанавливая блокировку записи на исходный файл, создавая временные файлы и переименовывая их позже. Таким образом, процесс чтения постоянно просматривает новый файл, эти два вместе вызывают полную конкуренцию ввода-вывода.