InnoDB - I / O ghi đĩa cao trên tệp ibdata1 và ib_logfile0


8

Đặc điểm kỹ thuật máy chủ: VPS với thông tin sau

model name  : Intel(R) Xeon(R) CPU           E5649  @ 2.53GHz
MemTotal:      2058776 kB
MemFree:        244436 kB

Chúng tôi đang chạy IP.Board từ Invision Power Services, chúng tôi đang sử dụng innodb_file_per_tablevà đã tải lại cơ sở dữ liệu để giảm kích thước ibdata1. Tuy nhiên, gần đây chúng tôi vẫn gặp vấn đề về việc sử dụng CPU và I / O cao mặc dù ibdata1kích thước giảm .

Từ kiểm tra của tôi, tôi tin rằng nó gây ra bởi việc sử dụng I / O cao ibdata1. Dưới đây là dữ liệu tôi thu được bằng cách sử dụng pt-ioprofile -cell sizes(trong Percona ToolKit). Về cơ bản, đó là tổng số tiền I / O được thu thập trong khoảng thời gian 30 giây.

# pt-ioprofile -cell sizes
Fri Jul 20 10:22:23 ICT 2012
Tracing process ID 8581
     total      pread       read     pwrite      fsync       open      close   getdents      lseek      fcntl filename
   6995968          0          0    6995968          0          0          0          0          0          0 /db/mysql/ibdata1
   1019904          0          0    1019904          0          0          0          0          0          0 /db/mysql/ib_logfile0
    204800     204800          0          0          0          0          0          0          0          0 /db/mysql/admin_phpbb3forum/phpbb_posts.ibd
     49152      49152          0          0          0          0          0          0          0          0 /db/mysql/admin_ips/ips_reputation_cache.ibd
     32768      32768          0          0          0          0          0          0          0          0 /db/mysql/admin_ips/ips_reputation_totals.ibd
     29808          0          0          0          0          0          0      29808          0          0 /db/mysql/admin_ips/
... (other trivial I/O records truncated)

Chạy iotopvà tôi thấy DISK WRITE:đi lên và xuống xung quanh 2M/s200K/s

Câu hỏi của tôi là, tại sao chúng ta phải tôi cao / O ghi trên ibdata1ib_logfileXtrong khi chúng tôi chỉ có khoảng 5-10 cập nhật nhỏ cho mỗi thứ hai vào các bảng phiên của chúng tôi, mà cũng là MEMORYbảng (chỉ khoảng 300K kích thước)? Điều này làm tôi bối rối vì cũng không có I / O ghi tương đương trên bất kỳ tệp bảng nào khác, điều này cho thấy rằng I / O ghi không phải do UPDATE/INSERT/DELETE.

Lưu ý rằng tôi chỉ là một lập trình viên tình cờ có nhiệm vụ duy trì điều này, vì vậy xin vui lòng hỏi thêm thông tin. Tôi đã làm rất nhiều thứ cho máy chủ này, nhưng xin đừng cho rằng tôi đã làm bất cứ điều gì tôi nên làm.

Thông tin bổ sung:

# ls -l /db/mysql/ib*
-rw-rw---- 1 mysql mysql  18874368 Jul 21 01:26 /db/mysql/ibdata1
-rw-rw---- 1 mysql mysql 134217728 Jul 21 01:26 /db/mysql/ib_logfile0
-rw-rw---- 1 mysql mysql 134217728 Jul 21 01:26 /db/mysql/ib_logfile1

mysql> SHOW VARIABLES LIKE 'innodb%';
+-------------------------------------------+------------------------+
| Variable_name                             | Value                  |
+-------------------------------------------+------------------------+
| innodb_adaptive_flushing                  | ON                     |
| innodb_adaptive_flushing_method           | estimate               |
| innodb_adaptive_hash_index                | ON                     |
| innodb_adaptive_hash_index_partitions     | 1                      |
| innodb_additional_mem_pool_size           | 20971520               |
| innodb_autoextend_increment               | 8                      |
| innodb_autoinc_lock_mode                  | 1                      |
| innodb_blocking_buffer_pool_restore       | OFF                    |
| innodb_buffer_pool_instances              | 1                      |
| innodb_buffer_pool_restore_at_startup     | 0                      |
| innodb_buffer_pool_shm_checksum           | ON                     |
| innodb_buffer_pool_shm_key                | 0                      |
| innodb_buffer_pool_size                   | 402653184              |
| innodb_change_buffering                   | all                    |
| innodb_checkpoint_age_target              | 0                      |
| innodb_checksums                          | ON                     |
| innodb_commit_concurrency                 | 0                      |
| innodb_concurrency_tickets                | 500                    |
| innodb_corrupt_table_action               | assert                 |
| innodb_data_file_path                     | ibdata1:10M:autoextend |
| innodb_data_home_dir                      |                        |
| innodb_dict_size_limit                    | 0                      |
| innodb_doublewrite                        | ON                     |
| innodb_doublewrite_file                   |                        |
| innodb_fake_changes                       | OFF                    |
| innodb_fast_checksum                      | OFF                    |
| innodb_fast_shutdown                      | 1                      |
| innodb_file_format                        | Barracuda              |
| innodb_file_format_check                  | ON                     |
| innodb_file_format_max                    | Barracuda              |
| innodb_file_per_table                     | ON                     |
| innodb_flush_log_at_trx_commit            | 2                      |
| innodb_flush_method                       | O_DIRECT               |
| innodb_flush_neighbor_pages               | 0                      |
| innodb_force_load_corrupted               | OFF                    |
| innodb_force_recovery                     | 0                      |
| innodb_ibuf_accel_rate                    | 100                    |
| innodb_ibuf_active_contract               | 1                      |
| innodb_ibuf_max_size                      | 201310208              |
| innodb_import_table_from_xtrabackup       | 0                      |
| innodb_io_capacity                        | 4000                   |
| innodb_kill_idle_transaction              | 0                      |
| innodb_large_prefix                       | OFF                    |
| innodb_lazy_drop_table                    | 0                      |
| innodb_lock_wait_timeout                  | 50                     |
| innodb_locks_unsafe_for_binlog            | OFF                    |
| innodb_log_block_size                     | 4096                   |
| innodb_log_buffer_size                    | 4194304                |
| innodb_log_file_size                      | 134217728              |
| innodb_log_files_in_group                 | 2                      |
| innodb_log_group_home_dir                 | ./                     |
| innodb_max_dirty_pages_pct                | 75                     |
| innodb_max_purge_lag                      | 0                      |
| innodb_mirrored_log_groups                | 1                      |
| innodb_old_blocks_pct                     | 37                     |
| innodb_old_blocks_time                    | 0                      |
| innodb_open_files                         | 300                    |
| innodb_page_size                          | 16384                  |
| innodb_purge_batch_size                   | 20                     |
| innodb_purge_threads                      | 1                      |
| innodb_random_read_ahead                  | OFF                    |
| innodb_read_ahead                         | linear                 |
| innodb_read_ahead_threshold               | 56                     |
| innodb_read_io_threads                    | 24                     |
| innodb_recovery_stats                     | OFF                    |
| innodb_recovery_update_relay_log          | OFF                    |
| innodb_replication_delay                  | 0                      |
| innodb_rollback_on_timeout                | OFF                    |
| innodb_rollback_segments                  | 128                    |
| innodb_show_locks_held                    | 10                     |
| innodb_show_verbose_locks                 | 0                      |
| innodb_spin_wait_delay                    | 6                      |
| innodb_stats_auto_update                  | 0                      |
| innodb_stats_method                       | nulls_equal            |
| innodb_stats_on_metadata                  | OFF                    |
| innodb_stats_sample_pages                 | 8                      |
| innodb_stats_update_need_lock             | 1                      |
| innodb_strict_mode                        | OFF                    |
| innodb_support_xa                         | ON                     |
| innodb_sync_spin_loops                    | 30                     |
| innodb_table_locks                        | ON                     |
| innodb_thread_concurrency                 | 0                      |
| innodb_thread_concurrency_timer_based     | OFF                    |
| innodb_thread_sleep_delay                 | 10000                  |
| innodb_use_global_flush_log_at_trx_commit | ON                     |
| innodb_use_native_aio                     | ON                     |
| innodb_use_sys_malloc                     | ON                     |
| innodb_use_sys_stats_table                | OFF                    |
| innodb_version                            | 1.1.8-rel27.1          |
| innodb_write_io_threads                   | 24                     |
+-------------------------------------------+------------------------+
90 rows in set (0.00 sec)

Từ @RolandoMySQLDBA: Vui lòng chạy cái này

SET @TimeInterval = 300;
SELECT variable_value INTO @num1 FROM information_schema.global_status
WHERE variable_name = 'Innodb_os_log_written';
SELECT SLEEP(@TimeInterval);
SELECT variable_value INTO @num2 FROM information_schema.global_status
WHERE variable_name = 'Innodb_os_log_written';
SET @ByteWrittenToLog = @num2 - @num1;
SET @KB_WL = @ByteWrittenToLog / POWER(1024,1) * 3600 / @TimeInterval;
SET @MB_WL = @ByteWrittenToLog / POWER(1024,2) * 3600 / @TimeInterval;
SET @GB_WL = @ByteWrittenToLog / POWER(1024,3) * 3600 / @TimeInterval;
SELECT @KB_WL,@MB_WL,@GB_WL;

và hiển thị đầu ra. Điều này sẽ cho bạn biết có bao nhiêu byte mỗi giờ được ghi vào ib_logfile0 / ib_logfile1 dựa trên 5 phút tiếp theo.

Kết quả truy vấn SQL trên (Vào lúc 8 giờ sáng giờ địa phương, trong khi các thành viên trực tuyến chiếm khoảng 25% chỉ số trong ngày):

mysql> SELECT @KB_WL,@MB_WL,@GB_WL;
+--------+----------+-------------------+
| @KB_WL | @MB_WL   | @GB_WL            |
+--------+----------+-------------------+
|  95328 | 93.09375 | 0.090911865234375 |
+--------+----------+-------------------+
1 row in set (0.00 sec)

Vui lòng chạy sau đây ls -l /var/lib/mysql/ib*tôi muốn xem kích thước tập tin. Tôi cũng cần biết phiên bản MySQL nào bạn đang chạy và nếu tất cả dữ liệu của bạn là InnoDB.
RolandoMySQLDBA

Vui lòng chạy này: SHOW VARIABLES LIKE 'innodb%';và hiển thị nó trong câu hỏi của bạn !!!
RolandoMySQLDBA

@RolandoMySQLDBA Cảm ơn bạn đã quan tâm. Câu hỏi hiện được cập nhật với kích thước tệp và biến innodb.
tia

Bao nhiêu RAM trên máy chủ DB ???
RolandoMySQLDBA

@RolandoMySQLDBA Nó có 2GB. Tôi đã cập nhật câu hỏi cho phù hợp.
tia

Câu trả lời:


7

Dưới đây là một vài điều bạn có thể thay đổi

  • innodb_log_buffer_size : Bạn có 4M. Mặc định là 8M. Hãy thử nâng nó lên 8 triệu.
  • innodb_log_file_size : Bạn có 128M. Đưa ra thông tin sau bạn đã cung cấp
    • bạn viết trên avg 93MB mỗi giờ vào các tệp nhật ký innodb, dựa trên 25% của chỉ số
    • thời gian cao điểm sẽ là khoảng 372 MB một giờ
    • một nửa là 186 MB làm tròn thành 192 MB
    • đặt innodb_log_file_size thành 192M
  • innodb_io_capacity có vẻ hơi cao, làm cho nó 200 hoặc 300 (tùy thuộc vào phần cứng)
  • innodb_read_io_threads innodb_write_io_threads nên được tối đa hóa ở mức 64. Đôi khi, ít hơn là tốt hơn trong môi trường nặng ký. Sử dụng 8 hoặc 16 trong những trường hợp như vậy.

Để thay đổi innodb_log_file_size thành 192M, hãy thêm phần này vào /etc/my.cnf

[mysqld]
innodb_log_buffer_size=8M
innodb_log_file_size=192M
innodb_open_files=300
innodb_read_io_threads=64
innodb_write_io_threads=64

sau đó làm như sau

mysql -u... -p... -e"FLUSH TABLES;"
service mysql stop
mv /var/lib/mysql/ib_logfile0 /var/lib/mysql/ib_logfile0000
mv /var/lib/mysql/ib_logfile1 /var/lib/mysql/ib_logfile0001
service mysql start

Kiểm tra điều này trong thời gian chậm và xem nếu điều này cải thiện mọi thứ

CẬP NHẬT 2012-10-19 12:31 EDT

Để đặt tình huống của bạn vào viễn cảnh, hãy nghĩ về mục đích của ibdata1 và ib_logfile0 / 1 là gì. Thay vì viết lại tất cả mọi thứ, vui lòng đọc bài đăng gần đây nhất của tôi về Tệp Nhật ký ibdata1 và InnoDB: Chính xác các tệp iblog trong mysql là gì

Khi bạn đã đọc bài đăng khác của tôi, bây giờ hãy xem xét điều này: Điều gì sẽ làm tăng I / O trên các tệp này?

  • Cập nhật chỉ mục phụ trong bộ đệm chèn của ibdata1
  • Dọn dẹp phân đoạn Rollback / Hoàn tác không gian

IMHO Tôi sẽ tăng nhóm đệm InnoDB từ 384M lên 1G.

Tôi cũng khuyên bạn nên nâng cấp RAM lên 8G

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.