Позвольте мне начать с признания, что я очень не осведомлен о внутренней работе жестких дисков. Поэтому, когда я перечитал руководство по переменной innodb_flush_method , меня это смутило. Могу ли я получить объяснение в терминах непрофессионала о разнице в O_DSYNC и O_DIRECT и о том, как узнать, является ли это проблемой производительности на сервере базы данных.
Немного статистики на моей установке: Mac OSX 10.6 (32-битное ядро, поскольку архитектура устарела) под управлением MySQL 5.1.49-64bit (надеясь, что это позволит мне использовать память). 8 ГБ ОЗУ, ~ 6 ГБ данных / индексов innodb.
Ответы:
Вот объяснение того, как
fdatasync()
работает против того, какfsync()
работаетfdatasync()
сбрасывает все буферы данных файла на диск (до возврата системного вызова). Это напоминает,fsync()
но не требуется для обновления метаданных, таких как время доступа. Приложения, которые обращаются к базам данных или файлам журналов, часто записывают крошечный фрагмент данных (например, одну строку в файле журнала), а затемfsync()
немедленно вызывают , чтобы убедиться, что записанные данные физически хранятся на жестком диске. К сожалению,fsync()
всегда будут инициировать две операции записиЕсли время модификации не является частью концепции транзакции, то
fdatasync()
ее можно использовать, чтобы избежать ненужных операций записи на диск inode.В английском языке,
O_DSYNC
быстрее ,O_DIRECT
так какO_DIRECT
звонки вfsync()
два раза (один для журналов и один для данных) иfsync()
проверяет запись данных с помощью двух операций записи. ИспользованиеO_DSYNC
звонковfdatsync()
иfsync()
. Вы можете думать о том,fdatasync()
как делать асинхронныеfsync()
(не проверяющие данные) данные.Глядя на числа,
O_DSYNC
выполняется четыреfsync()
операции записи, две из которых проверяются, в то время как выполняется четыре операции записи, после чего все проверяются.ВЫВОД
O_DSYNC
O_DIRECT
O_DIRECT
Я надеюсь, что этот ответ поможет, и я надеюсь, что я не усугубил ситуацию для вас.
источник
This means that in principal, fdatasync can execute faster than fsync because it needs to force only one disk write instead of two. However, in current versions of Linux, these two system calls actually do the same thing, both updating the file's modification time.
в то время, когда я писал свой пост 3,5 года назад, это было правдой, особенно в старых версиях Linux.The related system call fsync() commits just the buffered data relating to a specified file descriptor. fdatasync() is also available to write out just the changes made to the data in the file, and not necessarily the file's related metadata.
(последнее обновление Вики состоялось 28 июля 2014 г.).