sync

1. Что делает sync и зачем она нужна

1.1 Принцип работы

Команда sync заставляет ядро ОС записать все отложенные данные в буферах памяти на физические устройства хранения (диски, SSD). В Linux каждая запись в файловой системе сначала попадает в кэш, а затем, по расписанию или при определённых условиях, выводится на диск. Если система внезапно отключится, часть данных может остаться только в RAM и будет утеряна. sync принудительно инициирует синхронизацию и гарантирует, что все кэши будут опустошены до завершения процесса.

1.2 Влияние на производительность

Запуск sync блокирует процесс до тех пор, пока все операции записи не завершатся. Поэтому её следует использовать в тех случаях, когда целостность важнее скорости: при завершении работы сервера, перед обновлением ядра, после критической транзакции БД.

2. Как правильно вызывать sync

2.1 Стандартный вызов

Bash
sync

Эта команда не принимает аргументов и синхронизирует всю файловую систему.

2.2 Использование в скриптах

В shell‑скриптах часто добавляют задержку после sync, чтобы дать системе время завершить все асинхронные операции:

Bash
#!/bin/bash
sync
sleep 1   # ждём, пока всё отработает

2.3 Оптимизация частоты синхронизации

Для систем с большим объёмом операций можно настроить fsync через fscache. Команда sync обычно вызывается автоматически при завершении процессов, но иногда полезно принудительно задать расписание:

Bash
echo 10 > /proc/sys/vm/dirty_expire_centisecs   # каждые 100 мс

3. Применение в различных сценариях

3.1 Перед отключением питания

Для ноутбуков и серверов без UPS рекомендуется запускать sync перед выключением:

Bash
sudo shutdown -h now && sync

Это снижает риск повреждения файловой системы при неожиданном потоке.

3.2 После критической записи в БД

Сервера PostgreSQL, MySQL могут вызывать pg_ctl reload или mysqladmin flush-logs, но для полной гарантии целостности добавьте:

Bash
sync && echo 1 > /proc/sys/vm/drop_caches   # сброс кэша после записи

3.3 В системах с RAID

При работе в RAID‑10 или LVM важно убедиться, что все слои синхронизированы. После mdadm --assemble используйте:

Bash
sync && echo 3 > /proc/sys/vm/drop_caches   # сброс всех кэшей до сборки

4. Альтернативы и расширенные варианты

4.1 fsync() в программном коде

Для приложений, пишущих на C/C++, можно вызвать системный вызов fsync(fd), который синхронизирует только конкретный файл.

4.2 sync -f (синхронизация файловой системы)

Некоторые дистрибутивы поддерживают опцию -f, заставляющую синхронизацию происходить по файловой системе, а не по всем монтируемым устройствам:

Bash
sudo sync -f /mnt/data

4.3 Использование systemd unit

Можно создать юнит для регулярной синхронизации:

Bash
[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. Практические рекомендации

Когда использоватьЧто делатьПочему это важно
При выключении сервера без UPSsudo sync && sudo shutdown -h nowПредотвращает потерю данных и повреждение FS
После завершения критической транзакции в БДsync; drop_cachesГарантирует сохранение всех изменений на диск
В системах с частыми монтированными USBПлановый sync каждые 5 минутСнижает риск потери данных при отключении устройства

7. Часто задаваемые вопросы

  1. Можно ли использовать sync в реальном времени для потоковой передачи?
    Нет, sync блокирует процесс; лучше использовать fsync() в коде.
  2. Как проверить, что все кэши действительно опустошены?
    После sync можно вывести /proc/diskstats и убедиться, что значения write_bytes увеличились.
  3. Есть ли риск повреждения при частом вызове sync?
    Нет, но слишком частые вызовы могут замедлить систему из‑за длительных операций записи.

8. Итоги

Команда sync в linux является простым, но мощным инструментом для обеспечения целостности данных. Понимание её работы, правильное применение и регулярный мониторинг позволяют избежать потери информации даже при внезапных сбоях питания или аппаратных отказах. Используйте её там, где критична надежность: перед выключением, после важных транзакций и в системах с RAID‑конфигурациями.