1.问题发现
最近我服在运行时有许多玩家都在反馈服务器非常卡,亲自上线后发现问题确实如此。
2.服务器基本情况
- 服务端是在一个佬朋友的服务器上托管,性能方面为64h128g,网络有两条线路,甚至还为校园内的大学生玩家提供了一条校园网专线。按理来说应该不是性能及网络影响的。
- 服务器是一个以高铁为特色的多城市纯生存服。城市之间跨度较大,最远一玩家xz轴约30000处
- 可视区块为14
3.问题解析
一开始我们以为是存档过大的问题,因为曾听说佬朋友服务器存档已达到5个G的大小。但后来经存档备份后发现存档是嵌套的,实际大小只有1.5G。
随后,我们注意到了服务器“城市之间跨度较大”的问题。当两个及以上的玩家在服务器内不同城市内游玩时,卡顿情况就会发生。当多个玩家在同一城市或同一地区游玩时,卡顿情况几乎没有。因此我们就感觉问题应该是发生在服务器对存档读取时的问题上。
我们都知道,基岩版世界所用的存档格式为 *.db ,其数据库则为谷歌leveldb的魔改版,使用Zlib压缩格式来储存资料(Github)。当然压缩并不会提升读写的性能,这是写后再做的事情。
我们找到了一本关于leveldb的使用手册,在手册的开头,就非常明了讲明这是一个怎么样的数据库。
写性能足够强悍,但读性能较为拉垮。
看看麻将这边魔改的leveldb性能。
数据模型
*每个条目都有16byte的键与100byte的值
读性能
第一条结果时在数据写入数据库后立即进行正向和反向顺序读取时的速率,其中,所写入的数据并未进行压缩。
第二条结果为数据库读写压缩后的数据(每秒大约 85,000 次读取)
第三条结果为,当提供足够大的内存时,压缩前后对比。压缩前每秒大约 100,000 次读取,速率为约为9.775微秒/次操作。压缩后每秒大约 190,000 次读取,速率为5.215微妙/次操作
经过mojang的魔改,当leveldb想要读取数据时,需要先要把压缩的数据解压再读取。
4.猜测
目前因技术力不足等原因暂时无法对游戏存档进行读写测试以获取充足的测试数据。但我们大概能猜测服务器卡顿的原因。主要如下
- 存档过大,数据过多。其中存在因玩家跑图所产生的无用区块。
- 存档所使用的leveldb数据库读性能较差
5.后续
服务器的卡顿已经不能正常的游戏了。经过多次的讨论我们最终决定,在1.18正式版发布前收拾未完成的项目,不再开新项目。待1.18正式版发布即开新档,旧存档归档。所有玩家需群居,不得做隐士。
在未来若有相关优化计划或我们自己去研发相关的优化方案将考虑重新上线该存档。
发表回复