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_table
die Datenbank und haben sie neu geladen, um die Größe von ibdata1 zu reduzieren. Trotz der reduzierten ibdata1
Größ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 iotop
und ich sehe DISK WRITE:
geht rauf und runter um 2M/s
und200K/s
Meine Frage ist, warum wir haben hohe I / O - Schreib auf ibdata1
und ib_logfileX
während wir nur etwa 5-10 kleines Update pro Sekunde in unsere Sitzungen Tabellen haben, die auch sind MEMORY
Tabelle (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)
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.SHOW VARIABLES LIKE 'innodb%';
und zeigen Sie das in Ihrer Frage an !!!Antworten:
Hier sind einige Dinge, die Sie ändern könnten
Fügen Sie dies zu /etc/my.cnf hinzu, um innodb_log_file_size in 192M zu ändern
Führen Sie dann die folgenden Schritte aus
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?
IMHO würde ich den InnoDB Buffer Pool von 384M auf 1G erhöhen.
Ich würde auch empfehlen, RAM auf 8G zu aktualisieren
quelle