sync
1. Что делает sync и зачем она нужна
1.1 Принцип работы
Команда sync заставляет ядро ОС записать все отложенные данные в буферах памяти на физические устройства хранения (диски, SSD). В Linux каждая запись в файловой системе сначала попадает в кэш, а затем, по расписанию или при определённых условиях, выводится на диск. Если система внезапно отключится, часть данных может остаться только в RAM и будет утеряна. sync принудительно инициирует синхронизацию и гарантирует, что все кэши будут опустошены до завершения процесса.
1.2 Влияние на производительность
Запуск sync блокирует процесс до тех пор, пока все операции записи не завершатся. Поэтому её следует использовать в тех случаях, когда целостность важнее скорости: при завершении работы сервера, перед обновлением ядра, после критической транзакции БД.
2. Как правильно вызывать sync
2.1 Стандартный вызов
syncЭта команда не принимает аргументов и синхронизирует всю файловую систему.
2.2 Использование в скриптах
В shell‑скриптах часто добавляют задержку после sync, чтобы дать системе время завершить все асинхронные операции:
#!/bin/bash
sync
sleep 1 # ждём, пока всё отработает2.3 Оптимизация частоты синхронизации
Для систем с большим объёмом операций можно настроить fsync через fscache. Команда sync обычно вызывается автоматически при завершении процессов, но иногда полезно принудительно задать расписание:
echo 10 > /proc/sys/vm/dirty_expire_centisecs # каждые 100 мс3. Применение в различных сценариях
3.1 Перед отключением питания
Для ноутбуков и серверов без UPS рекомендуется запускать sync перед выключением:
sudo shutdown -h now && syncЭто снижает риск повреждения файловой системы при неожиданном потоке.
3.2 После критической записи в БД
Сервера PostgreSQL, MySQL могут вызывать pg_ctl reload или mysqladmin flush-logs, но для полной гарантии целостности добавьте:
sync && echo 1 > /proc/sys/vm/drop_caches # сброс кэша после записи3.3 В системах с RAID
При работе в RAID‑10 или LVM важно убедиться, что все слои синхронизированы. После mdadm --assemble используйте:
sync && echo 3 > /proc/sys/vm/drop_caches # сброс всех кэшей до сборки4. Альтернативы и расширенные варианты
4.1 fsync() в программном коде
Для приложений, пишущих на C/C++, можно вызвать системный вызов fsync(fd), который синхронизирует только конкретный файл.
4.2 sync -f (синхронизация файловой системы)
Некоторые дистрибутивы поддерживают опцию -f, заставляющую синхронизацию происходить по файловой системе, а не по всем монтируемым устройствам:
sudo sync -f /mnt/data4.3 Использование systemd unit
Можно создать юнит для регулярной синхронизации:
[Unit]
Description=Periodic Sync
[Service]
Type=oneshot
ExecStart=/usr/bin/sync
[Install]
WantedBy=multi-user.targetПосле включения через systemctl enable sync.service команда будет выполняться при старте системы.
5. Как проверить, что синхронизация прошла успешно
5.1 Мониторинг /proc/mounts
Проверка монтирования в режиме noatime и nodiratime поможет снизить частоту записи. После sync можно убедиться, что все данные записаны.
5.2 Использование dmesg
В выводе dmesg ищите сообщения вида “Writing data to disk” или ошибки связанные с дисковыми устройствами после запуска sync.
5.3 Сравнение контрольных сумм
Для критических файлов можно сравнить хеши до и после sync. Если они совпадают, значит данные действительно записались.
6. Практические рекомендации
| Когда использовать | Что делать | Почему это важно |
|---|---|---|
| При выключении сервера без UPS | sudo sync && sudo shutdown -h now | Предотвращает потерю данных и повреждение FS |
| После завершения критической транзакции в БД | sync; drop_caches | Гарантирует сохранение всех изменений на диск |
| В системах с частыми монтированными USB | Плановый sync каждые 5 минут | Снижает риск потери данных при отключении устройства |
7. Часто задаваемые вопросы
- Можно ли использовать
syncв реальном времени для потоковой передачи?
Нет,syncблокирует процесс; лучше использоватьfsync()в коде. - Как проверить, что все кэши действительно опустошены?
Послеsyncможно вывести/proc/diskstatsи убедиться, что значенияwrite_bytesувеличились. - Есть ли риск повреждения при частом вызове
sync?
Нет, но слишком частые вызовы могут замедлить систему из‑за длительных операций записи.
8. Итоги
Команда sync в linux является простым, но мощным инструментом для обеспечения целостности данных. Понимание её работы, правильное применение и регулярный мониторинг позволяют избежать потери информации даже при внезапных сбоях питания или аппаратных отказах. Используйте её там, где критична надежность: перед выключением, после важных транзакций и в системах с RAID‑конфигурациями.