发新话题
打印

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

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

大家也知道,妖城魔力一个区开服了十周年多了
" T! N/ K* s3 N; j魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート. B- F. C  y. u, K* Q
不管是数据库还是data的冗余肯定都非常多。魔力私服,最新魔力宝贝私服技术交流! D' a4 V! n7 o
魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表$ }$ n+ w- R4 V0 M
对于妖城这样的数据量大的服务器,首先数据库肯定不能放在跟服务端运行的同一个服务器里。bbs.mocwww.com% t1 t  U9 A' h+ |1 `! K/ O/ |
% W  [0 x4 m1 O& d* s( \
这是基本的,所以,最好是运行服务端的服务器一台,数据库单独一台。魔力私服,最新魔力宝贝私服技术交流" \* }& ], J" n* V# W( L
—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート' h9 t& A$ W5 r4 R0 |4 I: i
因为数据库大了之后,mysql的资源占用也是很可观的。能省则省。
# v+ D; v- |4 `. J* j2 f—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート
7 c4 Q/ S. e6 W8 I# O% O然后关于在有限资源的前提下(魔力原生的服务端是只能运行32位系统的,也就是最大4g内存,后续可能有别的引擎升级兼容了64位那另说)—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート$ V( {1 T& a7 [3 g
—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート8 b1 ]# B5 C- _/ Q# h/ W
优化有两个方面
7 S7 ~; a9 r- ~一:data方面
3 [3 n" R  C* ~& p妖城在线论坛data下几乎所有的txt设定,比如npc/msg/itemset/enemy等等
/ j; `4 n, A2 d/ r5 k. l1 H; a—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート记住编号不要随意乱设置,尽量往小的,没用到的设定
& F4 v8 o1 [8 T3 Y3 [bbs.mocwww.com比如你不要把一个msg的编号设定成390000000,三亿多了
; g* D2 p' f; a+ g/ o. w因为在程序的逻辑里,我不可能为了寻找到某个编号,就每次去整个msg里面从上到下循环搜索吧?
+ h# o0 x  _  M% ^4 n& ?—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート所以程序逻辑,会在服务端启动的时候,就根据你msg的最大编号为上限,设定一个跳转表。
3 T5 |3 L; X2 ?6 A$ x—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート对程序员来说,讲到这里应该就懂了
. j- Z" [# b2 D7 B- q—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート但是对于非程序员来说,我多说两句,跳转表是为了快速定位数据不需要从上到下循环搜索的。
. q: O( }- l) ~% E4 y6 s魔力私服,最新魔力宝贝私服技术交流你可以理解跳转表是连续的一堆信息。
& f0 x& A" f( @) ~; k! X( r- M你的msg编号最大的如果是100000,那么程序启动的时候就会设定10万个连续的数据空间用来存放对应每个msg编号指向msg.txt的哪一行。妖城在线论坛( [  {& T: n* r/ P! [
这样,当游戏里,需要调用到某个msg的时候(比如道具说明啊,npc对话啊,boss发言啊之类的)  V8 ?6 B" a5 G
它直接通过编号获取跳转表指向的msg行,获取到msg的内容。bbs.mocwww.com4 b2 {6 e8 X" l  V! M+ E. t) ]
这就导致了一个问题,你要是把msg的最大编号设置成3亿多。。。。可想而知浪费了多少内存?魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表6 [4 `& w0 K; c

+ m/ g; v5 ~' ^5 c4 H妖城在线论坛data下的其它文档也是一样的道理。用编号,不要太任性。4 I0 d; n/ m8 }$ q5 l$ v* K4 t

. j! j+ M# S( p7 `* B* ?( J魔力私服,最新魔力宝贝私服技术交流二:lua方面bbs.mocwww.com: i1 K; S4 M$ ^4 @) d- a
lua方面最大的内存占用,应该就是table类型的反复释放和创建了。魔力私服,最新魔力宝贝私服技术交流. j! }. I, j! a
因为没有深入阅读lua的代码魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表5 a% {( d5 O3 l; g" M4 ]6 _3 l
所以对于lua的内存管理一直是很懵的。
9 |7 m" G. G) O% b3 C$ T魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表如果没有对内存占用比较敏感的话
- Q  `6 b3 ]+ H4 Y& x; d魔力私服,最新魔力宝贝私服技术交流正常运行的服务器,一般都会给每个玩家登陆的时候,或者玩家某个行为的时候,创建一个临时的tabble
9 E* Z4 a4 G! E/ d( B+ w魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表这个table的生命周期仅限于这玩家本次登录的时候。bbs.mocwww.com" @4 f: l8 c9 l
然后玩家下线了,就释放掉,比如tablexx=nil
" I" x/ _+ t9 O) g- Y% E魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表但是这样做有一个问题。。。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート* D* T8 B9 K* J! M8 s7 r6 V  p
你可以尝试一个玩家登陆的时候,你创建一个百万级别的table项目。
) ?1 V( V+ q$ ^9 b, [—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート玩家下线的时候,你nil掉这个table
4 ~7 k& A4 P  k( Y; \+ S% J( X/ T—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート并且你也可以及时得使用lua的垃圾回收释放无效的内存。
% \/ c2 s7 l( V- x7 a% u—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート但问题是,你垃圾回收后,你读取lua的占用内存,发现确实下降了
; w, ~6 R' v$ f0 X但是在linux下用系统命令top查看。。。。。
0 `6 G  W3 S7 L% d# e" Q& C, u& J妖城在线论坛魔力服务端所占用的内存毫无下降。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート6 T2 ~! x& j; p7 V2 u( S0 Z
那么你再次登陆角色,又创建了一批内存% N3 j- M" B: L6 b+ c8 O
我至今依然没有通读lua引擎的代码,所以依然不能确定lua的内存管理方式。
' u! {3 r+ `, U+ d/ e1 ~魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表但是根据这段时间的测试2 q3 K& S& X6 `. Y- R. G% @& i
可以总结经验(并不一定对):lua会霸占整个系统的内存,并以你目前最大用到的多少为限,你用lua的垃圾回收功能,是回收了, L: E4 b/ R6 ]4 O* e1 \
但是这部分内存并不归还给linux系统( g# g% Z3 T* G  ~  q
lua会认为,你既然现在能用到这个尺度的内存,那我留着,你等下迟早也要用到。。。。。
- {  [+ g6 N$ i5 K* O- Z' z这就导致了,不停的table的nil释放并不能真正释放整个魔力服务端运行时占用的内存bbs.mocwww.com5 L# q3 T; s7 F' K, j: g0 u
这个跟正常的编程意识就有点不符合了。。。。。。( U& P$ P  j" M" I: h4 U5 F% y! w, k
但反正它大概是这么操作的。
% a1 ?  a, ]8 F/ |: F  _( C+ Y  g魔力私服,最新魔力宝贝私服技术交流解决方案是什么呢?
" c2 Y/ m; R" C: f—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート不要用cdkey啥的做table的key(如果非要不可,我感觉宁愿弄成field存到数据库中)
$ R0 o% I9 t& Z/ R5 z魔力私服,最新魔力宝贝私服技术交流启动的时候,根据当前设定的最大在线人数,预先扩充一个tablebbs.mocwww.com, _' _2 j4 _5 c
这个table的索引key使用CharIndex这个序号
) \8 @. J1 J" K+ S$ W1 l" I& C玩家下线的时候,不要nil掉,只要再次初始化数据就好了。
& P2 \2 K1 i7 U# m- l2 T. u% L—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート这样就不会反复创建了
0 t( `  x" h' D0 s2 A妖城在线论坛
0 m* O8 O/ r. j- J1 B5 L—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート三:引擎,c语言方面# F- m% j1 M& u- d; U
也是同样的观点。4 p, j+ C' h0 Y7 {- }/ ~
尽量预设开辟一段既定的内存空间,不要试图去在登陆和登出的时候频繁的创建和释放—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート- F6 P0 _8 b/ t' \, S- y. D
魔力私服,最新魔力宝贝私服技术交流- U  F9 z3 g3 J9 w1 A
最初妖城启动占用内存大概2.3g,运行大概十天半个月后,就会出现内存溢出,轻则挂端重则回档。妖城在线论坛9 K% G& X$ X4 I% P% z
后来优化后(其实没有优化到极致)启动占用内存800m左右,干净的系统top下观察占用内存1g而已, H3 V5 I+ N0 o, ]" i
连续运行几个月都不会有问题。
8 w* R9 X, ?& ]- k, d. x" Jbbs.mocwww.com妖城在线论坛- J9 f- ?: e% T! p
以上说的三个方面—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート" o( m$ Q0 G! P5 z0 }
两个都是一般的开服的gm自己可以控制优化的,第三个是必须引擎技术商方面优化的。
1 W' A6 e$ A( R
) c5 \! z; X. i* g0 ~( b大家可以试一下
妖城欢迎您!

TOP

补充几点
9 S. p+ ^/ T/ U/ H—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート1. 关于可用内存,实际上linux上面只有3g,windows下面只有2g9 N1 ]- N6 ?% ?- T1 K8 d! i
2. luajit 可用内存是2g,除非 64位+GC64模式魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表$ n- H: c) }  H
2.1. 内存回收,lua 申请的内存看luajit的实现了,默认跟c一样的处理逻辑,但如果是myalloc的话,大概率会有内存泄漏,不过就算是c的内存申请后也不是马上归回系统的。
7 J2 h5 f6 R+ C. p' V6 O—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート3. gmsv里面动态申请的数据主要是迷宫,不过引擎的myalloc,大概率会有内存泄漏9 V2 g+ o; Y1 C3 V& C" R; {( G, _
+ M7 Y" M% |1 F3 W
[ 本帖最后由 Muscipular 于 2023-5-15 12:40 编辑 ]

TOP

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

TOP

发新话题