Làm rõ về biến innodb_flush_method của MySQL


21

Hãy để tôi bắt đầu bằng cách thừa nhận rằng tôi rất không biết gì về hoạt động bên trong của đĩa cứng. Vì vậy, khi tôi đọc qua hướng dẫn sử dụng biến innodb_flush_method , nó làm tôi bối rối. Tôi có thể nhận được lời giải thích trong các điều khoản của giáo dân về sự khác biệt trong O_DSYNC và O_DIRECT không, và làm thế nào để biết đó có phải là vấn đề về hiệu suất trên máy chủ cơ sở dữ liệu không.

Một số thống kê về thiết lập của tôi: Mac OSX 10.6 (kernel 32 bit, do kiến ​​trúc đã lỗi thời) chạy MySQL 5.1,49-64bit (hy vọng nó sẽ cho phép tôi sử dụng bộ nhớ). RAM 8GB, ~ 6GB dữ liệu / chỉ mục innodb.


2
Tôi không biết nếu Mac OS X hỗ trợ tùy chọn IO trực tiếp phù hợp - tôi không nghĩ nó đã làm. Bạn là người thứ hai tôi thấy hôm nay bị bối rối bởi trang hướng dẫn đó. Tôi có một lỗi mở ở đây: bug.mysql.com/orms.php?id=54306
Morgan Tocker

Câu trả lời:


16

Dưới đây là một lời giải thích về cách làm fdatasync()việc so với cách làm fsync()việc

fdatasync()tuôn ra tất cả các bộ đệm dữ liệu của một tệp vào đĩa (trước khi cuộc gọi hệ thống trở lại). Nó giống fsync()nhưng không bắt buộc phải cập nhật siêu dữ liệu, chẳng hạn như thời gian truy cập. Các ứng dụng truy cập cơ sở dữ liệu hoặc tệp nhật ký thường ghi một đoạn dữ liệu nhỏ (ví dụ: một dòng trong tệp nhật ký) và sau đó gọi fsync()ngay để đảm bảo dữ liệu bằng văn bản được lưu trữ trên ổ cứng. Thật không may, fsync()sẽ luôn luôn bắt đầu hai hoạt động viết

  • một thao tác ghi cho dữ liệu mới được viết
  • một thao tác ghi để cập nhật thời gian sửa đổi được lưu trong inode

Nếu thời gian sửa đổi không phải là một phần của khái niệm giao dịch, thì fdatasync()có thể được sử dụng để tránh các hoạt động ghi đĩa inode không cần thiết.

Trong tiếng Anh, O_DSYNCnhanh hơn O_DIRECTkể từ khi O_DIRECTgọi fsync()hai lần (một cho nhật ký và một cho dữ liệu) và fsync()xác minh ghi dữ liệu thông qua hai thao tác ghi. Sử dụng O_DSYNCcuộc gọi fdatsync()fsync(). Bạn có thể nghĩ về fdatasync()việc thực hiện một fsync()dữ liệu không đồng bộ (không xác minh dữ liệu).

Nhìn vào các con số, O_DSYNCcó bốn thao tác ghi, hai trong số đó được xác minh, trong khi fsync()bốn thao tác ghi, tất cả đều được xác minh sau đó.

PHẦN KẾT LUẬN

  • O_DSYNC
    • nhanh hơn so với O_DIRECT
    • Dữ liệu có thể / có thể không nhất quán do độ trễ hoặc sự cố hoàn toàn
  • O_DIRECT
    • ổn định hơn
    • dữ liệu phù hợp
    • tự nhiên chậm hơn

Tôi hy vọng câu trả lời này có ích, và tôi hy vọng tôi đã không làm mọi thứ tồi tệ hơn với bạn.


2
Đáng để chỉ ra: O_DIRECT chỉ được sử dụng trên các tệp không gian bảng, không phải trên nhật ký. Ngoài ra - việc O_DIRECT có hữu ích hay không phụ thuộc vào phần cứng. Tôi đã liên kết với một lỗi tài liệu mở như là một nhận xét cho câu hỏi của tác giả.
Morgan Tocker

Cảm ơn bạn đã làm rõ điều đó, Morgan. Tôi sẽ sửa nó.
RolandoMySQLDBA

O_DSYNC là ghi đồng bộ, làm thế nào bạn có thể kết luận rằng nó nhanh hơn không đồng bộ + fsync?
noonex

@noonex fdatasync () là đồng bộ cho dữ liệu của nó, không phải siêu dữ liệu của nó. Theo notifyit.com/articles/article.aspx?p=23618&seqNum=5 , 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.tại thời điểm tôi viết bài đăng của mình 3,5 năm trước, điều đó là đúng, đặc biệt là với các phiên bản Linux cũ hơn.
RolandoMySQLDBA

@noonex Theo en.wikipedia.org/wiki/Sync_(Unix) , 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.(Wiki đó được cập nhật lần cuối vào ngày 28 tháng 7 năm 2014).
RolandoMySQLDBA
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.