我正在为游戏服务器(玩家信息、保存数据、东西)运行带有 MySQL(InnoDB)的 NodeJS。服务器是基于 HTTP(S) 的,所以没有实时性。
从下图中可以看出,我遇到了这些奇怪的峰值(第一个图是请求/秒,最后一个图是查询/秒)
在响应时间图表上,您可以看到紫色的最大响应时间和蓝色的平均响应时间。即使有 10-20k 个峰值,平均 95% 的请求也会保持在 50-100 毫秒。
我一直在挖掘,发现慢查询没什么特别的。通常使用保存数据(~2kb 的 blob)更新查询或修改用户名左右的玩家配置文件更新。没有加入或类似的东西。我们谈论的是少于 100k 行的表。
服务器在 Ubuntu 14.04 上的 Azure 中运行,MySQL 5.7 使用 4 个内核和 7GB 的 RAM。
MySQL 设置:
innodb_buffer_pool_size=4G
innodb_log_file_size=1G
innodb_buffer_pool_instances=4
innodb_log_buffer_size=4M
query_cache_type=0
tmp_table_size=64M
max_heap_table_size=64M
sort_buffer_size=32M
wait_timeout=300
interactive_timeout=300
innodb_file_per_table=ON
编辑:事实证明,问题从来不是 MySQL 性能,而是 SQL 查询之前的 Node.js 性能。更多信息在这里:Node.js multer 和 body-parser 有时非常慢