我有一个运行 Symfony 2.x 的 PHP5.6 应用程序,由 MySQL 5.1.73 支持。目前,在高峰负载期间,我们的数据层会出现延迟。在正常运行期间,我们每秒大约有 2k 个查询,性能良好,应用服务器的响应时间小于 200ms,其中 45ms 是 MySQL 时间,但在高峰负载时,我们可能会看到每秒 6k 个查询,持续大约 5-10 分钟,每天两次,每个工作日。此时,我们可以看到应用服务器响应达到 8,550ms,其中 8,420ms 是 MySQL 时间。
服务器规格:RAM 64GB Intel(R) Xeon(R) CPU E5-2640 v4 @ 2.40GHz
我们设置为多租户系统,其中每个租户在数据库服务器上都有自己的数据库模式,大约有 3000 个模式。
慢查询日志显示,每个架构中对同一张表的选择都很慢,但这也是吞吐量最高的表。对于我们较繁忙的租户,此表最多可达 70MB,包含约 500,000 行。
我想更改以下配置(一些配置会在几天/几周内逐渐更改)以提高性能:
thread_cache_size
:64->128->256->512->1000
我们的线程创建值在峰值负载下可以达到 3000,据我所知,创建线程是一个昂贵的过程,我希望这可以减少这种情况。我想逐渐增加缓存以观察影响。在处理繁忙的 PHP 应用程序时,是否有设置此值的特定策略?
innodb_thread_concurrency
:8->0
据我所知,不设置任何限制是最好的选择,除非数据库服务器显示资源争用(但似乎并非如此)。
innodb_buffer_pool_size
:16384M -> 45000M
key_buffer
:32187M -> 500M
大约一年前,我们完成了从 MyISAM 到 InnoDB 的迁移,但我们仍然还没有调整 key_bufferinnodb_buffer_pool_size
来反映这一点。
在过去几周内,我们将该table_open_cache
值从 1k -> 4k -> 8k 增加,因为我们发现打开的表比可用的表多table_open_cache
。这产生了积极影响,但不足以处理我们的负载峰值。
这些配置中是否有任何一个高于或低于合理值?我知道当您对数据集的了解有限时可能很难回答,但请告诉我,我会提供我所能提供的。
我保留了以下可能重要的任何价值:
mysql> SHOW GLOBAL VARIABLES;
+-----------------------------------------+-------------------------------------------------------------------------------------------+
| Variable_name | Value |
+-----------------------------------------+-------------------------------------------------------------------------------------------+
| innodb_adaptive_hash_index | ON |
| innodb_additional_mem_pool_size | 1048576 |
| innodb_autoextend_increment | 8 |
| innodb_autoinc_lock_mode | 1 |
| innodb_buffer_pool_size | 17179869184 |
| innodb_checksums | ON |
| innodb_commit_concurrency | 0 |
| innodb_concurrency_tickets | 500 |
| innodb_doublewrite | ON |
| innodb_fast_shutdown | 1 |
| innodb_file_io_threads | 4 |
| innodb_file_per_table | ON |
| innodb_flush_log_at_trx_commit | 2 |
| innodb_flush_method | O_DIRECT |
| innodb_lock_wait_timeout | 50 |
| innodb_log_buffer_size | 1048576 |
| innodb_log_file_size | 524288000 |
| innodb_max_dirty_pages_pct | 90 |
| innodb_open_files | 131072 |
| innodb_rollback_on_timeout | OFF |
| innodb_stats_on_metadata | ON |
| innodb_support_xa | ON |
| innodb_sync_spin_loops | 20 |
| innodb_table_locks | ON |
| innodb_thread_concurrency | 8 |
| join_buffer_size | 1048576 |
| max_connect_errors | 100 |
| max_connections | 10000 |
| max_join_size | 18446744073709551615 |
| max_length_for_sort_data | 1024 |
| max_long_data_size | 134217728 |
| max_prepared_stmt_count | 131072 |
| max_tmp_tables | 32 |
| query_cache_limit | 2097152 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 1406140416 |
| query_cache_type | ON |
| read_buffer_size | 262144 |
| read_only | OFF |
| read_rnd_buffer_size | 262144 | |
| sort_buffer_size | 262144 | |
| table_definition_cache | 315000 |
| table_lock_wait_timeout | 50 |
| table_open_cache | 8000 | |
| thread_cache_size | 64 |
| thread_handling | one-thread-per-connection |
| thread_stack | 262144 | |
| timed_mutexes | OFF | |
| tmp_table_size | 67108864 | |
| transaction_alloc_block_size | 8192 |
| transaction_prealloc_size | 4096 |
| tx_isolation | REPEATABLE-READ |