IO Chờ gây ra quá nhiều chậm chạp (EXT4 JDB2 ở mức 99% IO) trong Cam kết Mysql


14

Tôi đang viết một bộ chỉ mục, sử dụng python, lập chỉ mục các tài liệu và chèn chúng vào Cơ sở dữ liệu, Trước đó là một quy trình đơn lẻ nhưng bây giờ tôi đã thực hiện nó để xử lý đa quy trình với 4 quy trình song song đang chạy. Sau mỗi lần trích xuất văn bản, nó chèn vào cơ sở dữ liệu và thực hiện một cam kết.

Bây giờ nó gặp vấn đề IO, vấn đề IO chính không phải là quá trình của tôi mà là jdb2, hệ thống journeling của EXT4. Nó ở mức 99,99% và đặt CPU để chờ IO ở mọi Cam kết MySQL.

Tôi thấy nhiều người gặp vấn đề đó trên internet và giải pháp của họ là gắn kết bằng cách sử dụng rào cản = 0. Điều đó sẽ vô hiệu hóa Nhật ký hoàn toàn? Máy chủ của tôi có UPS và cám dỗ để làm điều đó, phải không?


Là tất cả dữ liệu của bạn InnoDB ???
RolandoMySQLDBA

Câu trả lời:


4

Đặt cơ sở dữ liệu trên một hệ thống tệp không ghi nhật ký. Ít nhất là các máy chủ lớn hơn (oracle, sql server) có chức năng nhật ký riêng (nhật ký giao dịch) và tối ưu hóa IO của chúng theo đó. Bạn có nhật ký và cơ sở dữ liệu trên các hệ thống tệp và đĩa riêng biệt và dựa vào chức năng bên trong cơ sở dữ liệu để xử lý IO xấu. Thông thường không có thay đổi hệ thống tệp (thiết lập lớn hơn) ngoại trừ ngày ghi vì dù sao tệp không mở rộng - chúng sẽ được tạo với kích thước "cuối cùng" (ok, quản trị viên có thể thay đổi điều đó) và các thay đổi như tôi đã nói theo dõi bởi cơ sở dữ liệu nhật ký giao dịch cấp.

Bạn cũng có thể muốn cho chúng tôi biết lớp phần cứng của bạn là gì. Hầu hết mọi người đánh giá thấp rằng IOPS là yếu tố giới hạn cho cơ sở dữ liệu và nghĩ rằng một bộ đĩa nhỏ là môi trường thích hợp cho cơ sở dữ liệu lớn. Mặc dù một số người trong chúng tôi làm việc trên cơ sở dữ liệu bằng cách sử dụng số lượng đĩa lớn hơn, do đó có khả năng hỗ trợ số lượng IOPS cao hơn.


Tôi sẽ sửa đổi điều này thành sử dụng một hệ thống tập tin không sử dụng tạp chí cho dữ liệu mà chỉ siêu dữ liệu. Ext4 có thể được cấu hình theo cách này là tốt.
the-wợi

Đúng. Cuối cùng, jouirnal nhân đôi IO - và nhật ký cơ sở dữ liệu sẽ làm lại như vậy, vì vậy bạn sẽ có nhiều IOPS hơn bạn phải làm. Và dư thừa mà về cơ bản là không cần thiết. Hệ thống jouirnalling là NICE để bảo vệ tệp .... nhưng vô dụng khi ứng dụng đã làm như vậy, cơ sở dữ liệu nào.
TomTom

Cung cấp hiệu suất tốt nhất tại không ghi nhật ký? Cảm ơn!
Phyo Arkar Lwin

4

Luôn luôn có một sự đánh đổi giữa khả năng phục hồi và hiệu suất.

Với MySQL trên ext4, các rào cản = 1 mặc định thực sự gây ra sự chậm lại, tuy nhiên hành động đầu tiên không nên là vô hiệu hóa nhật ký hoặc bật dữ liệu = writBack.

Đầu tiên, nếu khả năng phục hồi có tầm quan trọng cao, RAID được hỗ trợ bằng pin chắc chắn rất đáng giá.

Các tùy chọn gắn kết mà tôi đã chọn, đặc biệt là trên RAID không có pin là:

/dev/mapper/vg-mysql--data  /var/lib/mysql/data ext4  defaults,noatime,nodiratime,barrier=1,data=ordered  0 0

Đây là cố ý không sử dụng data = writBack vì tôi không muốn mạo hiểm tham nhũng hệ thống tệp dẫn đến "dữ liệu cũ xuất hiện trong tệp sau khi gặp sự cố và khôi phục tạp chí" (trích dẫn từ man mount).

Cấu hình lý tưởng trong my.cnf cho khả năng phục hồi hoàn toàn xung quanh các cài đặt liên quan đến I / O là:

[mysqld]
sync_binlog = 1
innodb_flush_log_at_trx_commit = 1

Tôi đã chọn cho chuỗi các sự đánh đổi sau đây để tăng hiệu suất:

  1. sync_binlog = 0: đây là cấu hình MySQL đầu tiên mà tôi thay đổi khỏi khả năng phục hồi hoàn toàn. Lý do cho điều này là vì nó mang lại sự cải thiện hiệu suất đáng kể, đặc biệt là ở nơi binlog_format=row(không may cần cho Jira). Tôi đang sử dụng đủ các bản sao MySQL trong cụm rằng nếu binlog bị hỏng do kịch bản mất điện, tôi sẽ thực hiện một bản sao nhị phân từ một bản sao khác.
  2. innodb_flush_log_at_trx_commit = 2: Mặc dù giá trị 1 là bắt buộc để tuân thủ ACID đầy đủ, với giá trị 2 ", bộ đệm nhật ký được ghi ra tệp tại mỗi cam kết, nhưng thao tác tuôn ra đĩa không được thực hiện trên đó. tệp nhật ký diễn ra một lần mỗi giây khi giá trị là 2. Lưu ý rằng việc xả một lần mỗi giây không được đảm bảo 100% xảy ra mỗi giây, do các vấn đề lập lịch xử lý. " (trích dẫn từ tài liệu MySQL)
  3. Cập nhật các tùy chọn gắn kết để sử dụng data=writeback. Lưu ý rằng nếu đây là hệ thống tệp gốc của bạn, bạn cũng sẽ cần phải vượt qua tùy chọn dòng lệnh kernel. Tôi tập hợp một vài bước trên đó tại coderwall .
  4. Kiểm tra các giá trị khác nhau của innodb_flush_method. O_DIRECT được hiển thị để cải thiện hiệu suất trong một số khối lượng công việc, nhưng không có nghĩa là điều này sẽ hoạt động trong môi trường của bạn.
  5. Nâng cấp lên ổ SSD, trong trường hợp này bạn cũng sẽ muốn tăng innodb_io_capacity, và điều chỉnh các thiết lập như innodb_adaptive_flushing, innodb_read_io_threads, innodb_write_io_threads, innodb_purge_threads, và các thiết lập khác có thể có.

3

Rất có khả năng phụ trợ I / O của bạn không đối phó với tải tốt như vậy. Bạn nên đảm bảo hệ thống tập tin của bạn không ghi nhật ký dữ liệu. Tôi sẽ đề nghị sử dụng các data=writeback,relatime,nobarriertham số để gắn kết cho phân vùng dữ liệu của cơ sở dữ liệu của bạn làm tối ưu hóa nhanh và bẩn đầu tiên.

Ngoài ra, suy ra từ các triệu chứng của bạn, rõ ràng bạn không sử dụng bộ nhớ đệm ghi với bộ điều khiển của bạn. Bạn nên chắc chắn rằng bạn đang sử dụng bộ đệm ghi được hỗ trợ bằng pin hoặc flash trên bộ điều khiển của bạn và kích hoạt nó - điều này sẽ giúp bạn tăng hiệu suất đáng kể mà không làm tăng đáng kể nguy cơ mất dữ liệu hoặc hỏng. Lưu ý rằng việc sử dụng bộ đệm ghi mà không có pin hoặc sao lưu flash sẽ làm tăng đáng kể nguy cơ mất dữ liệu hoặc hỏng dữ liệu - vì vậy chỉ thực hiện việc này cho mục đích thử nghiệm và / hoặc nếu bạn có thể mất.


Vậy làm thế nào về: data = writBack, relatime, nobarrier và sau đó hoàn toàn vô hiệu hóa Đăng nhập mysql? Tôi nghĩ rằng điều này sẽ tăng tốc mọi thứ lên rất nhiều?
Phyo Arkar Lwin

hdpram -i cho thấy tôi đang sử dụng bộ nhớ đệm ghi. vậy hmm
Phyo Arkar Lwin

@ V3ss0n bạn không thể vô hiệu hóa đăng nhập cho một công cụ giao dịch - đó là trung tâm của nó. Bạn có thể chọn để di chuyển các bản ghi giao dịch với một khác nhau tập hợp các đĩa vì nó có một mô hình hoàn toàn khác nhau truy cập (chủ yếu là tuyến tính viết) so với dữ liệu cơ sở dữ liệu chính của bạn (ngẫu nhiên đọc / ghi) - đây là một cấu hình thường được khuyến khích. Đối với thiết lập lưu trữ của bạn: bạn không sử dụng bộ điều khiển RAID mà chỉ đơn giản là các đĩa riêng lẻ có ghi bộ đệm? Điều này sẽ không giúp bất kỳ ghi đồng bộ nào của bạn khi chúng đi kèm với các yêu cầu xóa bộ nhớ cache rõ ràng.
the-wợi

nobarriergiống như barrier=0?
Nic Cottrell

@NicCottrell vâng, chúng giống nhau.
kouton

3

Đây là một câu hỏi cũ, nhưng chúng tôi đã gặp phải những vấn đề tương tự (Chờ đợi IO cao và tốc độ chèn / cập nhật khủng khiếp) trong tuần qua trên một máy chủ chuyên dụng mới và giải pháp này trực tiếp giải quyết vấn đề này.

Vô hiệu hóa ghi nhật ký tune2fs -O "^has_journal" /dev/<drive>là giải pháp nhanh nhất vì nó loại bỏ sự chờ đợi IO vì quy trình JDB2. Nhưng điều này không được khuyến khích trừ khi bạn có ổ đĩa được hỗ trợ bởi vì bạn sẽ mất dữ liệu trong trường hợp xảy ra sự cố. Các bảng InnoDB an toàn nếu bạn đã doublewritekích hoạt trong MySQL. Nhưng các tệp như .frm, log, v.v ... không an toàn. Chúng tôi đã thử di chuyển các tệp này sang ổ đĩa khác (đặc biệt là nhật ký bin) nhưng chờ đợi jdb2 IO vẫn tồn tại. Vì vậy, nó đã không để lại cho chúng tôi rất thoải mái.

data=writeback,relatime,nobarrierkhông giúp nó tăng tốc độ ghi / đọc nhiều như vô hiệu hóa ghi nhật ký trên toàn bộ phân vùng. Nhiều tùy chọn hơn cho ext4 có trong tài liệu EXT4 .

Thủ phạm thực sự trong trường hợp của chúng tôi là sync_binlog. Chúng tôi đã thiết lập như 1trong /etc/mysql/my.cnfvà nó đã giết chết hiệu suất.

Percona xác nhận điều này ở đây . Chúng tôi đặt nó thành mặc định 0và hiệu suất tăng hơn 500%.


0

Bạn đang sử dụng công cụ cơ sở dữ liệu nào để chèn dữ liệu này vào?

Nếu đó là MyISAM: phải khóa toàn bộ bảng trong khi ghi, do đó, việc chạy các luồng chèn đồng thời sẽ giết chết BẤT K system hệ thống nào, bất kể mạnh đến đâu.

Hãy chắc chắn rằng bạn đang sử dụng InnoDB cho các bảng này.


Vì anh ta đang thực hiện các giao dịch, công cụ sẽ không phải là MyISAM vì MyISAM không hỗ trợ các giao dịch.
the-wợi

Arr, cân não.
thích nghi

Tôi đang sử dụng innodb, mysql5.5 mặc định là innodb.
Phyo Arkar Lwin

0

Ngoài ra, không liên quan trực tiếp đến mysql, nhưng một số HD có vấn đề với ext4 do quản lý năng lượng mạnh mẽ ... khi điều đó xảy ra, tải máy tăng lên mà không có bất kỳ hoạt động rõ ràng nào.

Hãy cố gắng vô hiệu hóa nó. đầu tiên hãy kiểm tra bất kỳ giá trị nào bạn có (nếu bạn cần đặt lại mà không cần khởi động lại) và sau đó vô hiệu hóa nó.

Kiểm tra giá trị hiện tại:

    hdparm -B /dev/sda

Vô hiệu hóa nó

   hdparm -B 255 /dev/sda

(hoặc bất cứ điều gì là HD của bạn) và kiểm tra. Có lẽ sẽ không giúp được cho hầu hết các vấn đề, nhưng nó có thể giúp một số người dùng ngoài kia. Khởi động lại sẽ đặt lại giá trị hoặc thay thế thủ công 255 cho giá trị trước đó.

Nếu nó giúp, kiểm tra /etc/default/hdparmhoặc /etc/hdparm.confcho một cấu hình lâu dài hơn, bằng cách đặt nó khi khởi động.

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.