亚马逊AWS官方博客

FunPlus 在 Graviton EC2 上运行游戏服务器的性能调优和成本优化实践

关于 FunPlus

FunPlus,中文名为趣加,是一家全球多元化的游戏研发、运营、发行品牌,2010 年在美国硅谷创立,总部位于瑞士。FunPlus 致力于为全球用户提供创新的娱乐体验,多年来,FunPlus 成功研发并推出了众多全球流行的移动游戏产品,其主要代表产品包括《State of Survival》、《King of Avalon》《Guns of Glory》等,凭借独特的游戏体验、创新的游戏内容和前卫的玩法设置,赢得了玩家的认可。FunPlus 旗下的工作室及项目团队凭借多年来在游戏开发中的技术积累和研发优势,不断拓展细分市场、持续进行差异化创新,聚焦探索新型电子游戏产品和前沿 AI 科技,推动游戏研发领域的生产力变革,不断提升游戏研发管道的自动化、智能化和游戏的自适应化。FunPlus 吸引了来自全球各地、拥有不同文化背景的 2000 多名专业游戏人才,并在中国大陆、日本、新加坡、西班牙和美国等多个国家和地区的十余个城市设有办事处 。

Graviton 介绍

Graviton 是亚马逊云科技开发的 ARM 架构 CPU 处理器,与传统的基于 x86 架构的 CPU 相比,它具有以下几个主要优势:

  • 高性能

在 Graviton 上,一个 vCPU 被映射到一个物理核心,并且没有同步多线程(SMT),与基于 x86 的实例相比,基于 Graviton 的实例不会因资源争用而出现性能下降。这使得在 x86 基础实例上限制到一定 CPU 利用率的工作负载,可以在 Graviton 上推动更高的 CPU 利用率,同时仍满足业务的性能要求。

  • 低成本

Graviton 实例的定价比同代 x86 实例更低,加上其性能提升,可以带来更高的性价比。

  • 高可扩展性

Graviton 首先支持高性能网络 ENA Express 和第二代 EFA 网络,提供更强的网络扩展能力。

目前 AWS 已经推出了 4 代 Graviton 处理器,性能不断提升。Graviton 是亚马逊云科技的差异化优势之一,提供了更先进的技术选择和卓越的性价比,可构建高性能且经济实惠的云上系统。

Funplus 的 Graviton 迁移实践

FunPlus 的主要游戏产品《State of Survival》《King of Avalon》《Guns of Glory》均运行在亚马逊云科技的海外区域,技术团队成员有超过 13 年的 AWS 云服务使用经验。从 2020 年 AWS 开始大规模推广采用第二代 Graviton 处理器的 EC2 服务器开始,Funplus 的技术团队便发现基于 ARM 架构的 Graviton EC2 具有的性价比优势,开始在支持游戏运行的技术中间件平台中逐步采用 Graviton EC2,多年来在运行稳定的前提下,降低了 FunPlus 游戏运营的成本。

2024 年,为了进一步提升游戏服务器的性价比,FunPlus 决定扩大 Graviton EC2 的使用范围,把主要游戏产品的游戏服也运行在 Graviton EC2 上。游戏服的主要组件包括:战斗服、地图服、数据服务,之前运行在使用 intel x86 CPU 的 AWS EC2 5 系机型,需要迁移到 Graviton EC2。

战斗服迁移

FunPlus SLG 游戏的战斗服采用 PHP 开发,在操作系统上安装 ARM 版本的 PHP 即可。FunPlus 原来使用的是 CentOS 7 系统,随着 CentOS 7 到达 EOL,在迁移 Graviton 的过程中,同时也选择了 Amazon Linux 做为运行游戏服务器的操作系统。

PHP 环境下载和安装

  1. 在 Amazon Linux2 上使用 extra repo
    amazon-linux-extras enable php7.3
  2. 安装 PECL 扩展包,可以安装 aarch64 的二进制包,也可以安装架构不相关的 noarch 包。比如一些依赖包可以直接从 centos 的镜像安装,可正常运行在 Amazon Linux 2 上
    wget http://mirror.centos.org/altarch/7/sclo/aarch64/rh/Packages/r/rh-php73-runtime-1-1.el7.aarch64.rpm
    wget http://mirror.centos.org/altarch/7/sclo/aarch64/rh/Packages/r/rh-php73-php-zip-7.3.20-1.el7.aarch64.rpm
    wget http://mirror.centos.org/altarch/7/sclo/aarch64/rh/Packages/r/rh-php73-php-json-7.3.20-1.el7.aarch64.rpm
    wget http://mirror.centos.org/altarch/7/sclo/aarch64/rh/Packages/r/rh-php73-php-common-7.3.20-1.el7.aarch64.rpm
    wget http://mirror.centos.org/altarch/7/sclo/aarch64/sclo/Packages/s/sclo-php73-php-pecl-igbinary-2.0.8-2.el7.aarch64.rpm
    rpm -ivh *
    
  3. 有些 PECL 包,如果网上找不到 aarch64 架构的,可以进行编译安装。这里以编译安装 php-pecl-zip 包举例,其他包的安装过程类似
    //编译 php-pecl-zip-1.18.2
    
    sudo yum update -y
    
    //install GCC on amazon linux 2
    sudo yum groupinstall "Development Tools"
    
    sudo amazon-linux-extras enable php7.3
    
    sudo amazon-linux-extras install php7.3
    
    sudo yum install php-devel
    
    sudo yum install -y php-pear
    
    //installing dependency first
    sudo yum install libzip-devel
    
    // installing
    sudo pecl install zip-1.18.2
    
    //packaging
    sudo pecl bundle zip-1.18.2
    
    //go to the folder generated by bundle
    cd zip
    
    //Generate the build configuration
    sudo phpize
    
    sudo ./configure
    
    sudo make
    
    sudo make install
    
    //The .so generated
    

战斗服性能测试

Server1 采用 x86 架构 CPU 的 C5.2xlarge,Server2 采用 Graviton 2 CPU 的 C6g.2xlarge,分别部署服务器测试环境,对战斗服性能进行压力测试。

在两台机器上分别安装 php 及扩展:

yum install -y httpd php php-gd php-xml php-mbstring php-ldap php-pear

压力测试结果:

Server1:

Requests per second:    6088.27 [#/sec] (mean)
Time per request:       328.501 [ms] (mean)
Time per request:       0.164 [ms] (mean, across all concurrent requests)
Transfer rate:          1134.97 [Kbytes/sec] received

Server2:

Requests per second:    6464.99 [#/sec] (mean)
Time per request:       309.359 [ms] (mean)
Time per request:       0.155 [ms] (mean, across all concurrent requests)
Transfer rate:          1204.75 [Kbytes/sec] received

结论:Graviton2 EC2 的 QPS 处理能力相较 x86 架构提升 6%

地图服与数据服的迁移

地图服(MapServer)与数据服(DataServer)均采用 Go 语言开发。由于 Go 开箱即用地支持 arm64 架构,只需使用 Go compiler 重新编译即可,无需对地图服的代码本身做任何修改。根据 AWS 官方提供的数据,Go 1.18 版本对 Graviton 进行了优化,可获得更好的性能。Funplus 也使用了 Go 1.18 版本运行地图服与数据服。

为了比较 Go 开发的应用程序在 Graviton 上的性能表现,我们对数据服(DataServe)性能测试效果进行了测试。

测试环境概述

压测 Client

32C+64G,运行压测客户端+etcd

Server01 Gravion2 CPU, c6g.2xlarge
5.10.210-201.852.amzn2.aarch64,8C+16G,运行 dataserver+dbproxy

Server02 x86, c5.2xlarge
4.18.0-147.8.1.el7.aarch64,8C+16G,运行 dataserver+dbproxy

压测步骤

  • 按照权重随机生成 request,根据配置的并发数量,无 sleep 的持续发送请求,持续 10 分钟(多次压测取平均值)。
  • 根据发送的请求记录状态,校验返回结果的正确性。
  • 后校验模式,即比对 dataserver 和 db 的数据的一致性。在压力测试完成之后,可启动该模式进行后校验。

测试结果

Server01 c6g.2xlarge
FetchV2: num=939473; slow=0; max_slow=0ms; ratio={0.50: 0ms; 0.75: 1ms; 0.90: 2ms; 1.00: 127ms}
CFetchV2: num=939058; slow=0; max_slow=0ms; ratio={0.50: 0ms; 0.75: 1ms; 0.90: 2ms; 1.00: 137ms}
ModifyV2: num=46893; slow=0; max_slow=0ms; ratio={0.50: 0ms; 0.75: 1ms; 0.90: 4ms; 1.00: 125ms}
IncrByV2: num=47430; slow=0; max_slow=0ms; ratio={0.50: 0ms; 0.75: 1ms; 0.90: 3ms; 1.00: 111ms}
CreateV2: num=18954; slow=0; max_slow=0ms; ratio={0.50: 0ms; 0.75: 1ms; 0.90: 2ms; 1.00: 120ms}
RemoveV2: num=9437; slow=0; max_slow=0ms; ratio={0.50: 0ms; 0.75: 1ms; 0.90: 3ms; 1.00: 105ms}
CRemoveV2: num=9306; slow=0; max_slow=0ms; ratio={0.50: 0ms; 0.75: 1ms; 0.90: 4ms; 1.00: 114ms}
CCountV2: num=9534; slow=0; max_slow=0ms; ratio={0.50: 0ms; 0.75: 1ms; 0.90: 2ms; 1.00: 92ms}
 2020085,1720975
Server02 c5.2xlarge
FetchV2: num=801333; slow=0; max_slow=0ms; ratio={0.50: 0ms; 0.75: 1ms; 0.90: 2ms; 1.00: 157ms}
CFetchV2: num=798756; slow=0; max_slow=0ms; ratio={0.50: 0ms; 0.75: 1ms; 0.90: 2ms; 1.00: 157ms}
ModifyV2: num=40443; slow=0; max_slow=0ms; ratio={0.50: 0ms; 0.75: 1ms; 0.90: 2ms; 1.00: 150ms}
IncrByV2: num=40382; slow=0; max_slow=0ms; ratio={0.50: 0ms; 0.75: 1ms; 0.90: 3ms; 1.00: 157ms}
CreateV2: num=16245; slow=0; max_slow=0ms; ratio={0.50: 0ms; 0.75: 1ms; 0.90: 2ms; 1.00: 142ms}
RemoveV2: num=7906; slow=0; max_slow=0ms; ratio={0.50: 0ms; 0.75: 1ms; 0.90: 3ms; 1.00: 120ms}
CRemoveV2: num=7911; slow=0; max_slow=0ms; ratio={0.50: 0ms; 0.75: 1ms; 0.90: 3ms; 1.00: 128ms}
CCountV2: num=7999; slow=0; max_slow=0ms; ratio={0.50: 0ms; 0.75: 1ms; 0.90: 2ms; 1.00: 140ms}

结论:从相同条件下多次压测平均结果看,c6g 主机承载的各类 QPS 相较 c5 增加 12%+。

DBProxy 服务迁移

DBProxy 是 Funplus 技术中台提供给各游戏业务用于访问 MySQL 数据库的中间件,采用 C++ 语言开发。在 Graviton 上对代码进行重新编译即可运行,没有对代码进行改动。AWS 官方建议使用最新版本的 GCC 对代码进行编译,可以获得更好的性能。FunPlus 目前使用的 Amazon Linux 2 系统自带的已经对 Graviton 进行过优化的 GCC 7 编译器。

业务成果

总的来说,通过大规模迁移游戏服到 AWS Graviton,帮助 Funplus 降低了成本、提高性能,对于在 AWS 云上运行工作负载并希望优化基础设施成本同时保持高性能的企业来说,Graviton 是一个很好的选择。下一步,FunPlus 会在更多业务场景上探索和扩大 Graviton 的使用范围,并测试 AWS 推出的第三代和第四代 Graviton EC2,以期获得更高的性价比。

参考资料

Graviton Technical Guide:https://github.com/aws/aws-graviton-getting-started

本篇作者

刘宗庆

FunPlus 运维负责人,在游戏行业从业 15 年,负责 FunPlus 整体业务的云上架构设计和实施工作,具有丰富的实践经验。

秦镜高

亚马逊云科技资深解决方案架构师,负责基于亚马逊云科技云计算方案的架构设计,帮助客户利用领先的云服务技术构建更具创新性的应用。加入亚马逊云科技之前,有 10 多年丰富的游戏开发和架构设计实践经验。

胡亚光

亚马逊云科技资深技术客户经理,主要负责游戏客户的架构优化、成本管理、技术咨询等工作。拥有超过 10 年项目实施和客户支持经验。在加入 AWS 前曾就职于 Citrix,主要服务于大型金融类客户。