0

我正在为游戏服务器(玩家信息、保存数据、东西)运行带有 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 有时非常慢

4

1 回答 1

1

检查你的swappiness(假设是0 mysql机器最大化ram使用):

> sysctl -A|grep swap
vm.swappiness = 0

只有 7G 的 RAM 和 4G 的缓冲池,如果 swappiness 不为零,您的机器将交换。

你能发布你的交换图和使用的内存吗?4G 缓冲区对于 7G ram 来说是“边缘”。对于 8G ram,我会给 3G,因为你在其他一切 mysql 明智 + 1G 上都有 +1G 在 OS 上。

您还有 1G 的事务日志文件,我假设您有两个日志文件。你有这么多的写入来拥有这么大的文件吗?您可以使用本指南:https ://www.percona.com/blog/2008/11/21/how-to-calculate-a-good-innodb-log-file-size/

于 2016-10-24T14:23:24.733 回答