InnoDB - Schreib-E / A mit hoher Festplatte für die Datei ibdata1 und ib_logfile0

8

Serverspezifikation: VPS mit folgenden Informationen

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

Wir führen IP.Board von Invision Power Services aus, verwenden innodb_file_per_tabledie Datenbank und haben sie neu geladen, um die Größe von ibdata1 zu reduzieren. Trotz der reduzierten ibdata1Größe haben wir in letzter Zeit immer noch Probleme mit einer hohen CPU- und E / A-Auslastung .

Nach meiner Inspektion glaube ich, dass dies durch eine hohe E / A-Nutzung verursacht wird ibdata1. Unten sind die Daten aufgeführt, die ich mit pt-ioprofile -cell sizes(in Percona ToolKit) erhalten habe. Grundsätzlich ist dies der gesamte E / A-Betrag, der innerhalb von 30 Sekunden gesammelt wurde.

# 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)

Laufen iotopund ich sehe DISK WRITE:geht rauf und runter um 2M/sund200K/s

Meine Frage ist, warum wir haben hohe I / O - Schreib auf ibdata1und ib_logfileXwährend wir nur etwa 5-10 kleines Update pro Sekunde in unsere Sitzungen Tabellen haben, die auch sind MEMORYTabelle (nur etwa 300 K in Größe)? Es ist mir ein Rätsel, weil es in keiner anderen Tabellendatei eine entsprechende Schreib-E / A gibt, was darauf hinweist, dass die Schreib-E / A nicht durch verursacht wird UPDATE/INSERT/DELETE.

Beachten Sie, dass ich nur ein Programmierer bin, der nur zufällig die Pflicht hat, dies aufrechtzuerhalten. Bitte zögern Sie nicht, weitere Informationen anzufordern. Ich habe viele Dinge an diesem Server getan, aber bitte gehen Sie nicht davon aus, dass ich etwas getan habe, was ich bereits hätte tun sollen.

Zusätzliche Information:

# 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

und

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)

Von @RolandoMySQLDBA: Bitte führen Sie dies aus

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;

und zeigen Sie die Ausgabe. Hier erfahren Sie, wie viele Bytes pro Stunde basierend auf den nächsten 5 Minuten in ib_logfile0 / ib_logfile1 geschrieben werden.

Über dem SQL-Abfrageergebnis (Um 8 Uhr Ortszeit, während die Mitglieder online ungefähr 25% der Statistik während des Tages ausmachen):

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)
tia
quelle
Bitte führen Sie die folgenden ls -l /var/lib/mysql/ib*Schritte aus, um die Dateigrößen anzuzeigen. Ich muss auch wissen, welche Version von MySQL Sie ausführen und ob alle Ihre Daten InnoDB sind.
RolandoMySQLDBA
Bitte führen Sie dies aus: SHOW VARIABLES LIKE 'innodb%';und zeigen Sie das in Ihrer Frage an !!!
RolandoMySQLDBA
@ RolandoMySQLDBA Vielen Dank für Ihr Interesse. Die Frage wurde jetzt mit den Dateigrößen und innodb-Variablen aktualisiert.
Tia
Wie viel RAM auf dem DB Server ???
RolandoMySQLDBA
@ RolandoMySQLDBA Es hat 2 GB. Ich habe die Frage entsprechend aktualisiert.
Tia

Antworten:

7

Hier sind einige Dinge, die Sie ändern könnten

  • innodb_log_buffer_size : Sie haben 4M. Der Standardwert ist 8M. Versuchen Sie es auf 8M zu erhöhen.
  • innodb_log_file_size : Sie haben 128M. Angesichts der folgenden Informationen, die Sie angegeben haben
    • Sie schreiben durchschnittlich 93 MB pro Stunde in die Innodb-Protokolldateien, basierend auf 25% der Statistik
    • Die Spitzenzeit würde etwa 372 MB pro Stunde betragen
    • Die Hälfte ist 186 MB, abgerundet auf 192 MB
    • setze innodb_log_file_size auf 192M
  • innodb_io_capacity scheint ein wenig hoch zu sein, machen Sie es 200 oder 300 (je nach Hardware)
  • innodb_read_io_threads und innodb_write_io_threads sollten bei 64 maximal sein. Manchmal ist weniger in einer schreibintensiven Umgebung besser. Verwenden Sie in solchen Fällen 8 oder 16.

Fügen Sie dies zu /etc/my.cnf hinzu, um innodb_log_file_size in 192M zu ändern

[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

Führen Sie dann die folgenden Schritte aus

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

Testen Sie dies in langsamen Zeiten und prüfen Sie, ob dies die Situation verbessert

UPDATE 19.10.2012 12:31 EDT

Um Ihre Situation ins rechte Licht zu rücken, überlegen Sie, wozu ibdata1 und ib_logfile0 / 1 dienen. Anstatt alles neu zu schreiben, lesen Sie bitte meinen letzten Beitrag über ibdata1- und InnoDB-Protokolldateien: Was genau sind iblog-Dateien in MySQL?

Wenn Sie meinen anderen Beitrag gelesen haben, denken Sie jetzt an Folgendes: Was würde die E / A für diese Dateien erhöhen?

  • Aktualisieren von Sekundärindizes im Einfügepuffer von ibdata1
  • Bereinigen der Rollback-Segmente / Rückgängig machen

IMHO würde ich den InnoDB Buffer Pool von 384M auf 1G erhöhen.

Ich würde auch empfehlen, RAM auf 8G zu aktualisieren

RolandoMySQLDBA
quelle