Skip to content

perf(save): пропускать запись файла объектов при неизменном инвентаре (#3440)#3452

Open
bylins wants to merge 1 commit into
masterfrom
perf/crash-frac-save-skip-3440
Open

perf(save): пропускать запись файла объектов при неизменном инвентаре (#3440)#3452
bylins wants to merge 1 commit into
masterfrom
perf/crash-frac-save-skip-3440

Conversation

@bylins

@bylins bylins commented Jun 14, 2026

Copy link
Copy Markdown
Owner

Проблема

Спайки Crash frac save в хартбите (до 100+ мс, напр. 0.1018с на проде).

Crash_frac_save_all каждый цикл по очереди сохраняет онлайн-игроков и безусловно переписывает файл объектов через save_char_objects, даже если инвентарь не менялся. Синхронная дисковая запись (write=) неизменившихся инвентарей и есть источник спайков (в отличие от аккаунта, у файла объектов skip-by-unchanged не было).

Решение

Для периодического crash-сейва (RENT_CRASH) считаем хеш содержимого файла объектов и пропускаем дисковую запись + пересчёт CRC, если оно не изменилось с прошлого сейва.

Ключевой момент: файл объектов — это чистый payload предметов; рент-таймеры пишутся отдельно в .time. Поэтому одинаковый набор предметов даёт байт-в-байт идентичный файл → запись не нужна, данные не теряются (.time пишется как обычно).

  • Остальные типы сейва (рент/ребут/idle-rent) пишут всегда.
  • Кэш uid → hash обновляется при каждой реальной записи; на пути «нет предметов» сбрасывается.

В духе фикса аккаунта из #3440 (skip-by-unchanged), но для файла объектов.

Эффект

Большинство онлайн-игроков в каждом цикле инвентарь не меняют → их файлы больше не переписываются → дробный crash-сейв перестаёт молотить диск на ровном месте.

Проверка

ninja -C build — собирается чисто, без предупреждений.

🤖 Generated with Claude Code

Crash_frac_save_all (размазанный crash-сейв) каждый цикл безусловно
переписывал файл объектов всех онлайн-игроков по очереди через
save_char_objects, даже если инвентарь не менялся. Синхронная дисковая
запись неизменившихся инвентарей -- основной источник спайков
"Crash frac save" в хартбите (до 100+ мс).

Теперь для периодического crash-сейва (RENT_CRASH) считаем хеш содержимого
файла объектов и пропускаем дисковую запись + пересчёт CRC, если оно не
изменилось с прошлого сейва. Файл объектов -- это чистый payload предметов
(рент-таймеры пишутся отдельно в .time), поэтому одинаковый payload даёт
байт-в-байт идентичный файл, и запись не нужна -- данные не теряются.

Остальные типы сейва (рент/ребут/idle-rent) пишут всегда. Хеш в кэше
обновляется при каждой реальной записи; на пути "нет предметов" сбрасывается.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant