我无法想出还有什么能够解决这个奇怪的问题。
我们有一个"工人"计算引擎是一个MySQL SLAVE。它的主要作用是处理大量数据,然后将其放回主数据库。全部通过PHP脚本处理。
现在处理数据大约需要4个小时才能完成。在此期间,我们注意到以下CPU模式。
您可以在上面看到的是服务器重启后50%可靠的CPU启动。然后在大约2小时后,它开始在CPu上产生ECG样式图案。大约每5/6分钟CPU峰值达到~48%,然后在5分钟内下降。
我的问题是,为什么。可以任意解释原因。理想情况下,我们希望这台服务器能够以100%的速度输出100%(50%,因为有2个核心)
服务器规格:2个VCPU,7.5GB内存。
如前所述,如果我们能够全速运转,那就太棒了。以下是my.cnf
symbolic-links=0
max_connections=256
innodb_thread_concurrency = 0
innodb_additional_mem_pool_size = 1G
innodb_buffer_pool_size = 6G
innodb_flush_log_at_trx_commit = 1
innodb_io_capacity = 800
innodb_flush_method = O_DIRECT
innodb_log_file_size = 24M
query_cache_size = 1G
query_cache_limit = 512M
thread_cache_size = 32
key_buffer_size = 128M
max_allowed_packet = 64M
table_open_cache = 8000
table_definition_cache = 8000
sort_buffer_size = 128M
read_buffer_size = 8M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 128M
tmp_table_size = 256M
query_cache_type = 1
join_buffer_size = 256M
wait_timeout = 300
server-id = 2
relay-log = /var/log/mysql/mysql-relay-bin.log
log_bin = /var/log/mysql/mysql-bin.log
log-error=/var/log/mysqld.log
read-only = 1
innodb_flush_log_at_trx_commit=2
我已经清理了上述内容,删除了任何与性能无关的隐私信息。
更新 我注意到当VPU在图形的心跳部分开始丢弃时,PHP脚本不再运行。这是不可能的,因为我知道的剧本需要4个小时。没有错误,再过4个小时,数据就是我预期的。
答案 0 :(得分:1)
将innodb_io_capacity = 800更改为1500可能会减少4小时的处理时间,方法是将限制提高到您知道的奴隶处理能力。
答案 1 :(得分:1)
对于7.5G指示的环境,配置有
innodb_additional_mem_pool_size=1G
innodb_buffer_pool_size=6G
query_cache_size=1G
所以在你开始之前,你是过度使用的。
另一个需要考虑的角度
max_connections=256
max_allowed_packet=64M
可以在一个完全忙碌的256个连接上需要16GB +才能使这个功能生存下来。
64M的max_allowed_packet不太合理。
将read_rnd_buffer_size = 4M更改为SET GLOBAL read_rnd_buffer_size=16384;
对您的奴隶来说可能很重要,然后24小时后在主人身上。它们可以是不同的,但如果它对减少奴隶的4小时有重要意义,则在两个实例上实施。请告诉我们这一改变对你有什么影响。
你看到的50%cpu利用率是最大限度地利用---它能够利用的单核---。正如PressingOnAlways最近所表明的那样。您无法在运行的脚本中调整限制。
要进行更全面的分析,请提供SLAVE AND MASTER RAM大小(nnG)
SHOW GLOBAL STATUS
SHOW GLOBAL VARIABLES
SHOW INNODB STATUS
答案 2 :(得分:0)
CPU%由所有核心测量 - 因此100%cpu使用率==两个核心最大化。默认情况下,PHP在单个线程中运行,不使用多核。您看到的50%cpu利用率是最大化其能够利用的单核的脚本。
为了利用100%的cpu,考虑产生2个PHP脚本,它们可以在2个不同的数据集上运行 - 例如脚本1处理记录1-1000000,而脚本2处理1000001-2000000。
其他选项是重写脚本以利用线程。你可能想考虑改变语言,以获得更有利于线程的东西,比如Golang?虽然如果主要工作是在mysql中完成的,这可能不是必需的。
当图表低于50%时,您看到的另一个问题可能是IO等待。但是,从图表中很难说,您可能遇到数据流传输瓶颈,而CPU在没有工作和等待大量数据传输的情况下。
优化CPU利用率是找到瓶颈并将其删除的一种练习 - 祝你好运。
答案 3 :(得分:0)
'监控服务'可以定期捕获系统的“运行状况检查”,因为当您看到峰值时,它似乎是在6分钟的周期内。
显示全球状态'Com_show_%status'可以确认此类活动。 将您的com_show_%状态计数器除以(正常运行时间/ 3600)以获得每小时的费率。 每小时10次,每6分钟一次。