innodb_flush_method = O_DIRECT so với O_DSYNC tác động đến hiệu suất trên ext3 với phân vùng đĩa LVM


12

Trong một trong các môi trường sản xuất của tôi, chúng tôi có hai phiên bản chạy trên cụm RedHat, với một phiên bản sản xuất được liên kết với cụm.

Chúng tôi có bộ nhớ chính 125G với nhóm bộ đệm InnoDB 24G bị chiếm bởi instance1 & 12G bị chiếm bởi instance2, không liên kết với cụm RedHat. Cả dữ liệu và nhật ký giao dịch đều nằm trên phân vùng đĩa LVM với hệ thống tệp ext3.

Để tăng hiệu suất và thông lượng I / O tốt hơn, tôi đã quyết định đổi innodb_flush_methodsang O_DIRECT.

Với tài liệu tham khảo về tài liệu MySQL:

Trong trường hợp dữ liệu InnoDB và file log được đặt trên một SAN, người ta đã phát hiện ra rằng việc thiết innodb_flush_methodđể O_DIRECTcó thể làm suy giảm hiệu suất của đơn giản SELECTtuyên bố bởi một yếu tố của ba.

Đề cập đến MySQL Ver 2 và 3 hiệu suất cao, có tuyên bố rằng các nhà phát triển InnoDB đã tìm thấy lỗi khi sử dụng innodb_flush_method=O_DSYNC. O_SYNCO_DSYNCtương tự fsync()fdatasync(): O_SYNCđồng bộ hóa cả dữ liệu và siêu dữ liệu, trong khi chỉ O_DSYNCđồng bộ hóa dữ liệu.

Nếu tất cả dường như rất nhiều lời giải thích mà không có lời khuyên, thì đây là lời khuyên:

nếu bạn sử dụng hệ điều hành giống Unix và bộ điều khiển RAID của bạn có bộ ghi dữ liệu dựa trên pin, chúng tôi khuyên bạn nên sử dụng O_DIRECT. Nếu không, mặc định hoặc O_DIRECTcó thể sẽ là lựa chọn tốt nhất, tùy thuộc vào ứng dụng của bạn.

Bằng cách googling, tôi đã nhận được báo cáo điểm chuẩn này : trên O_DSYNCvsO_DIRECT

Báo cáo điểm chuẩn:
===================
Kiểm tra giao dịch phức tạp 1B Row, 64 chủ đề

 * SAN O_DIRECT: yêu cầu đọc / ghi: 31560140 (8766.61 mỗi giây)
 * SAN O_DSYNC: yêu cầu đọc / ghi: 5179457 (1438,52 mỗi giây.)
 * SAN fdatasync: yêu cầu đọc / ghi: 9445774 (2623,66 mỗi giây.)
 * O_DIRECT đĩa cục bộ: yêu cầu đọc / ghi: 3258595 (905,06 mỗi giây)
 * O_DSYNC đĩa cục bộ: yêu cầu đọc / ghi: 3494632 (970,65 mỗi giây.)
 * Fdatasync đĩa cục bộ: yêu cầu đọc / ghi: 4223757 (1173,04 mỗi giây.

Tuy nhiên, O_DIRECTvô hiệu hóa bộ đệm cấp hệ điều hành, trong đó bộ đệm kép có thể bị vô hiệu hóa cho thấy thông lượng I / O tốt hơn.

Có tốt để đi với O_DIRECThơn là O_DSYNC? Hai tùy chọn này hơi khó hiểu. Tùy chọn nào có thể hiển thị một số thông lượng I / O tốt hơn và nâng cao hiệu suất mà không có bất kỳ tác động nào đến dữ liệu, đọc / ghi đặc biệt là trong sản xuất? Bất kỳ đề xuất tốt hơn dựa trên kinh nghiệm cá nhân của bạn?

Tôi có thể thấy Rolando Update trong bài viết :

Vẫn có một chút nhầm lẫn về cả hai tham số này. Nơi tôi có thể thấy hầu hết các mẫu cấu hình sản xuất bằng cách sử dụng O_DIRECT, tôi không thấy bất kỳ nơi nào đề xuất O_DSYNC.

Hệ thống

  • MySQL 5.1.51-Enterprise-gpl-pro-log
  • Red Hat Enterprise Linux Server phát hành 5.5
  • DELL DRAC với Bộ điều khiển Raid có pin ghi lại bộ nhớ cache 512MB
  • Bộ điều khiển Dell PERC H700 với bộ phận dự phòng pin (BBU).

Thông tin thêm

mysql hiển thị các biến như 'innodb_thread_concurrency'; 

+ --------------------------- + ------- +
| Biến_ame | Giá trị |
+ --------------------------- + ------- + 
| innodb_thread_concurrency | 96 |
+ --------------------------- + ------- + 
1 hàng trong bộ (0,00 giây) 

mysql hiển thị các biến như 'innodb_read_io_threads'; 
Tập rỗng (0,00 giây) 

mysql hiển thị các biến như 'innodb_write_io_threads'; 
Tập rỗng (0,00 giây)

Chúng tôi đang sử dụng plugin mặc định, vì vậy tôi đã đăng thông tin từ trạng thái InnoDB:

mysql CHỌN * TỪ các plugin Ở đâu PLUGIN_NAME THÍCH '% innodb%' VÀ PLUGIN_TYPE THÍCH 'CÔNG CỤ BẢO QUẢN' \ G
****** / TÌM KIẾM ******
           PLUGIN_NAME: InnoDB
        PLUGIN_VERSION: 1.0
         PLUGIN_STATUS: HOẠT ĐỘNG
           PLUGIN_TYPE: KỸ THUẬT BẢO QUẢN
   PLUGIN_TYPE_VERSION: 50151.0
        PLUGIN_LIBRary: NULL
PLUGIN_LIBRARY_VERSION: NULL
         PLUGIN_AUTHOR: Innobase OY
    PLUGIN_DESCRIPTION: Hỗ trợ giao dịch, khóa cấp hàng và khóa ngoại
        PLUGIN_LICENSE: GPL
1 hàng trong bộ (0,00 giây)

Câu trả lời:


7

Trở lại vào ngày 21 tháng 1 năm 2009, Peter Zaitsev đã tuyên bố như sau trên mysqlperformanceblog.com

Như lời kêu gọi hành động - Tôi chắc chắn muốn ai đó xem liệu EXT3 có thể được sửa chữa trong vấn đề này hay không vì đây là hệ thống tệp phổ biến nhất cho Linux. Cũng đáng để điều tra nếu một cái gì đó có thể được thực hiện ở phía MySQL - có thể mở binlog bằng O_DSYNCcờ nếu sync_binlog=1thay vì sử dụng fsync sẽ giúp ích? Hoặc có thể là binlog phân bổ trước sẽ là giải pháp tốt.

Cho đến nay, tôi biết không có ai đã chạm vào vấn đề này. O_DSYNCnhư một mặc định không phải là một triển vọng hấp dẫn nhưng không phù hợp với việc viết nhanh hơn mà không thực sự được xác minh. Đó là lý do tại sao có rất nhiều sự cường điệu xung quanh O_DIRECT.

Tôi có thể nói rằng bạn chưa cài đặt Plugin InnoDB. Với Plugin InnoDB, một số biến sẽ tồn tại.

Bạn nên nâng cấp InnoDB theo một trong hai cách:

  • Nâng cấp lên MySQL 5.5 (Tất cả các cải tiến của Plugin InnoDB là một phần của MySQL 5.5)
  • Nâng cấp Plugin InnoDB

Khi bạn đã làm như vậy, bạn có thể nâng cao InnoDB thành

  • truy cập nhiều CPU và lõi
  • tăng đọc và viết chủ đề I / O
  • mở rộng dung lượng I / O (điều này đặc biệt cần thiết cho các phương tiện lưu trữ khác nhau)

Dưới đây là những bài viết trước đây của tôi về cài đặt bạn có thể thay đổi cho điều này:


1

Tôi luôn có ấn tượng O_DIRECTlà tốt hơn cho hiệu suất vì nó ngăn chặn bộ đệm đôi. Ngoài ra, miễn là bạn có RAID phần cứng với bộ đệm ghi được hỗ trợ bằng pin. Tất nhiên, nó cũng phụ thuộc vào khối lượng công việc, cho dù bạn đang ĐỌC hay VIẾT nặng.

Ngoài ra, câu hỏi dành cho người dùng chuyên nghiệp thực hiện các cuộc gọi thêm để fsync()cho O_DIRECTnguyên nhân một sự xuống cấp đáng chú ý trong hiệu suất tổng thể, hoặc là nó không đáng kể? Tôi vẫn chưa thấy điểm chuẩn cho thấy điều này.

Ngoài ra, lưu ý rằng Percona đã kích hoạt khả năng thiết lập innodb_flush_method=ALL_O_DIRECT, cung cấp I / O trực tiếp không chỉ trên các tệp dữ liệu của InnoDB mà còn trên các nhật ký giao dịch của InnoDB cùng một lúc.


2
Quay lại năm 2012 nhóm bộ đệm không mở rộng tốt cho RAM lớn, do đó, bộ đệm đôi được đề cập có thể tốt cho các trường hợp khi bộ đệm của hệ điều hành lớn hơn nhiều so với nhóm bộ đệm innodb. Đối với 5.6 trở lên - tôi nói câu trả lời của bạn là hoàn toàn hợp lệ.
noonex
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.