发新话题
打印

[魔力私服分享] 关于服务端内存优化的一些经验

关于服务端内存优化的一些经验

大家也知道,妖城魔力一个区开服了十周年多了
4 m# C0 F" ~/ U" Y4 c妖城在线论坛
' ^; h% E' ]: ^魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表不管是数据库还是data的冗余肯定都非常多。
; L0 M8 D8 C0 e1 C—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート妖城在线论坛: i+ y5 {" p8 E
对于妖城这样的数据量大的服务器,首先数据库肯定不能放在跟服务端运行的同一个服务器里。
0 |& f' C! A1 A2 M, g$ [魔力私服,最新魔力宝贝私服技术交流
3 Z- z) U9 O+ N5 J! x妖城在线论坛这是基本的,所以,最好是运行服务端的服务器一台,数据库单独一台。
7 s' e3 o' N8 b$ D2 G; L( @0 Q妖城在线论坛妖城在线论坛/ `& |4 X0 t+ k1 c7 {
因为数据库大了之后,mysql的资源占用也是很可观的。能省则省。
" o: p8 D* @6 F2 q—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート
* m/ |, @- b# G' ?/ f% O妖城在线论坛然后关于在有限资源的前提下(魔力原生的服务端是只能运行32位系统的,也就是最大4g内存,后续可能有别的引擎升级兼容了64位那另说)
& @4 t% d, s! x; e( `# X—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート
$ [0 R+ q- F9 \/ p魔力私服,最新魔力宝贝私服技术交流优化有两个方面—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート7 M8 z+ J3 o, ~" S- O! F
一:data方面
/ w6 U) O3 P4 N0 g* Z, ~& K妖城在线论坛data下几乎所有的txt设定,比如npc/msg/itemset/enemy等等
5 r8 _2 M0 v+ S6 _0 Kbbs.mocwww.com记住编号不要随意乱设置,尽量往小的,没用到的设定
0 M% X, A6 ~' {% R4 C# r0 m—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート比如你不要把一个msg的编号设定成390000000,三亿多了魔力私服,最新魔力宝贝私服技术交流% g4 O& L" C7 O7 ?
因为在程序的逻辑里,我不可能为了寻找到某个编号,就每次去整个msg里面从上到下循环搜索吧?
- I( C/ T6 ^6 p! l妖城在线论坛所以程序逻辑,会在服务端启动的时候,就根据你msg的最大编号为上限,设定一个跳转表。魔力私服,最新魔力宝贝私服技术交流" p' q' }1 x) a! y' z
对程序员来说,讲到这里应该就懂了妖城在线论坛5 o$ H. X( h$ |# ]6 n& x& a
但是对于非程序员来说,我多说两句,跳转表是为了快速定位数据不需要从上到下循环搜索的。
/ s0 _" {3 t. ^3 X' ~妖城在线论坛你可以理解跳转表是连续的一堆信息。bbs.mocwww.com' J6 W6 a& n! `  I. C- B/ N
你的msg编号最大的如果是100000,那么程序启动的时候就会设定10万个连续的数据空间用来存放对应每个msg编号指向msg.txt的哪一行。bbs.mocwww.com7 _, z: _8 B: i9 N; [* ]
这样,当游戏里,需要调用到某个msg的时候(比如道具说明啊,npc对话啊,boss发言啊之类的)
) t" D3 j8 P; ?/ _8 R0 M' o它直接通过编号获取跳转表指向的msg行,获取到msg的内容。魔力私服,最新魔力宝贝私服技术交流9 ^; f  Q' ~5 [8 B( V  M) s
这就导致了一个问题,你要是把msg的最大编号设置成3亿多。。。。可想而知浪费了多少内存?
9 [6 w# \+ h4 }) v7 T魔力私服,最新魔力宝贝私服技术交流
, ]8 u+ c9 R, x0 k; d+ x魔力私服,最新魔力宝贝私服技术交流data下的其它文档也是一样的道理。用编号,不要太任性。
1 f: G: a& G' ?# E4 M
6 n2 Y, Y8 j7 B1 T魔力私服,最新魔力宝贝私服技术交流二:lua方面
3 h: d. f" U( ^; X$ V妖城在线论坛lua方面最大的内存占用,应该就是table类型的反复释放和创建了。魔力私服,最新魔力宝贝私服技术交流- Z$ s2 b  D# n; o. R. V
因为没有深入阅读lua的代码bbs.mocwww.com% w# w2 A) \9 ?0 H  v4 S* f% T+ B& U
所以对于lua的内存管理一直是很懵的。bbs.mocwww.com  u" ~) Z' v0 c: i, z/ K! G
如果没有对内存占用比较敏感的话
) D+ I6 A0 y3 }4 o0 \4 t正常运行的服务器,一般都会给每个玩家登陆的时候,或者玩家某个行为的时候,创建一个临时的tabble
4 A8 A9 z/ P2 A, n: B( ~魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表这个table的生命周期仅限于这玩家本次登录的时候。
5 c: ~. F" I' [0 V: P7 A然后玩家下线了,就释放掉,比如tablexx=nil
. c7 R. i  Z  S2 s* F3 b妖城在线论坛但是这样做有一个问题。。。
* i9 a4 b/ ]; f* Z( E妖城在线论坛你可以尝试一个玩家登陆的时候,你创建一个百万级别的table项目。魔力私服,最新魔力宝贝私服技术交流( ]/ A0 `2 e$ e; w& J% v8 y4 I
玩家下线的时候,你nil掉这个tablebbs.mocwww.com8 U" O! g; ^- l) D* D1 p! y5 ~
并且你也可以及时得使用lua的垃圾回收释放无效的内存。
8 T. y6 G  k8 O; r—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート但问题是,你垃圾回收后,你读取lua的占用内存,发现确实下降了
" {, q- b$ k  A, A) `+ g( P魔力私服,最新魔力宝贝私服技术交流但是在linux下用系统命令top查看。。。。。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート* W# ?* \) O) ?' z' Q5 A% b9 g
魔力服务端所占用的内存毫无下降。
6 j/ u% ~6 L. Y3 h那么你再次登陆角色,又创建了一批内存
# x5 s1 p8 e6 ^1 l7 }/ c2 I0 g( @) M3 Z魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表我至今依然没有通读lua引擎的代码,所以依然不能确定lua的内存管理方式。魔力私服,最新魔力宝贝私服技术交流% R0 \# B2 i: ~1 t( s2 k. i
但是根据这段时间的测试魔力私服,最新魔力宝贝私服技术交流& e) o/ W6 Y/ ^2 j0 J
可以总结经验(并不一定对):lua会霸占整个系统的内存,并以你目前最大用到的多少为限,你用lua的垃圾回收功能,是回收了
. a& N, J8 o1 C* u妖城在线论坛但是这部分内存并不归还给linux系统
2 p8 Z5 C! s6 a) g2 M/ f0 a  Llua会认为,你既然现在能用到这个尺度的内存,那我留着,你等下迟早也要用到。。。。。魔力私服,最新魔力宝贝私服技术交流+ k1 `5 x: k1 T* T; E! y
这就导致了,不停的table的nil释放并不能真正释放整个魔力服务端运行时占用的内存
4 p* ?: h" i" t2 {3 Lbbs.mocwww.com这个跟正常的编程意识就有点不符合了。。。。。。
4 l  o! O$ R0 M0 p/ L魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表但反正它大概是这么操作的。
* U7 w* [, p3 x; o/ W* T$ r, \魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表解决方案是什么呢?
1 J" o# P4 `5 \3 n4 Z! z$ {魔力私服,最新魔力宝贝私服技术交流不要用cdkey啥的做table的key(如果非要不可,我感觉宁愿弄成field存到数据库中)
& O/ g9 j# W4 b: g2 |/ Z$ V# ^bbs.mocwww.com启动的时候,根据当前设定的最大在线人数,预先扩充一个table
. O! s& [3 P" M4 ?. I7 L" N+ f0 ^魔力私服,最新魔力宝贝私服技术交流这个table的索引key使用CharIndex这个序号
7 w' a8 ?2 g0 _9 w# R$ \妖城在线论坛玩家下线的时候,不要nil掉,只要再次初始化数据就好了。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表  N0 I3 K, C- Q- G
这样就不会反复创建了
! z& z$ P5 s0 ?' _8 V) h魔力私服,最新魔力宝贝私服技术交流
. F% K% `0 {( I& \5 @4 [2 i—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート三:引擎,c语言方面—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート% r7 }& b4 f- S2 ?; V4 I6 }
也是同样的观点。7 Q3 T7 S. X! e, b1 W
尽量预设开辟一段既定的内存空间,不要试图去在登陆和登出的时候频繁的创建和释放—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート" N/ k2 T+ e1 [2 D6 |3 ^! h% t
魔力私服,最新魔力宝贝私服技术交流( g7 r: ~$ Q3 }/ F+ J
最初妖城启动占用内存大概2.3g,运行大概十天半个月后,就会出现内存溢出,轻则挂端重则回档。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表% n% W8 Q0 o& ^5 r! X0 P
后来优化后(其实没有优化到极致)启动占用内存800m左右,干净的系统top下观察占用内存1g而已
) R! H1 r" W* U, }—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート连续运行几个月都不会有问题。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート* }* a# U8 N& l$ q  y$ I( s9 |
bbs.mocwww.com* a7 L/ n4 A+ S7 p
以上说的三个方面
. z8 x' c: C$ U! J3 ]+ Z两个都是一般的开服的gm自己可以控制优化的,第三个是必须引擎技术商方面优化的。
5 Y" ^% E0 H# m& L! n: x魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表bbs.mocwww.com8 W* D. d# w& e7 h
大家可以试一下
妖城欢迎您!

TOP

补充几点bbs.mocwww.com/ [) I! v$ p7 U! R
1. 关于可用内存,实际上linux上面只有3g,windows下面只有2g妖城在线论坛3 |. J" m6 S1 e
2. luajit 可用内存是2g,除非 64位+GC64模式
" f. N) U3 d( p* G/ ]% f2 [—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート2.1. 内存回收,lua 申请的内存看luajit的实现了,默认跟c一样的处理逻辑,但如果是myalloc的话,大概率会有内存泄漏,不过就算是c的内存申请后也不是马上归回系统的。
4 R2 T4 ~2 |* V8 M' {妖城在线论坛3. gmsv里面动态申请的数据主要是迷宫,不过引擎的myalloc,大概率会有内存泄漏
( d# d, d0 G  l; `9 }0 ]; @妖城在线论坛7 k  b$ S" b: H
[ 本帖最后由 Muscipular 于 2023-5-15 12:40 编辑 ]

TOP

luajit我的是5.2.3版本的,所以我这边垃圾回收操作是不释放内存归还系统的
妖城欢迎您!

TOP

发新话题