发新话题
打印

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

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

大家也知道,妖城魔力一个区开服了十周年多了
7 s8 i1 }! `1 b
" u  P3 l* e  r8 g$ bbbs.mocwww.com不管是数据库还是data的冗余肯定都非常多。; k0 m6 v  R' k; _  C- H' b- f' W
妖城在线论坛/ T/ @3 s: x' H( u( s& e6 b
对于妖城这样的数据量大的服务器,首先数据库肯定不能放在跟服务端运行的同一个服务器里。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート/ C& x8 Y4 R1 c9 t+ R5 L& N- `8 {

% r& O# ?3 j" y' Z/ g魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表这是基本的,所以,最好是运行服务端的服务器一台,数据库单独一台。
0 |6 _- D. i: H, X' w- @: R魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表- J: I* m  Y7 v" I  i
因为数据库大了之后,mysql的资源占用也是很可观的。能省则省。
1 n' R6 \- \+ F( Q' U0 D2 Z) R—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート
6 [7 @5 w  j, g7 A3 L$ b6 ^9 o) B( x魔力私服,最新魔力宝贝私服技术交流然后关于在有限资源的前提下(魔力原生的服务端是只能运行32位系统的,也就是最大4g内存,后续可能有别的引擎升级兼容了64位那另说)魔力私服,最新魔力宝贝私服技术交流2 O& b) z  C' r8 s: K- K$ G9 S( a

4 s+ P! |+ Y/ Y: G9 N, g. Z" v" w5 s—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート优化有两个方面
4 w9 a8 p$ Q& F3 u—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート一:data方面
0 ]3 ~3 X& [  y+ R! S—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲートdata下几乎所有的txt设定,比如npc/msg/itemset/enemy等等
4 I- c3 @( B# Q! g妖城在线论坛记住编号不要随意乱设置,尽量往小的,没用到的设定妖城在线论坛8 z. J5 z5 G% s+ a) {
比如你不要把一个msg的编号设定成390000000,三亿多了魔力私服,最新魔力宝贝私服技术交流; u: E1 j$ w3 ?0 a0 z
因为在程序的逻辑里,我不可能为了寻找到某个编号,就每次去整个msg里面从上到下循环搜索吧?
7 c* J5 X! _! H5 F% r2 H2 y所以程序逻辑,会在服务端启动的时候,就根据你msg的最大编号为上限,设定一个跳转表。' `# i+ m& v( p8 [' r2 z* ?/ f
对程序员来说,讲到这里应该就懂了bbs.mocwww.com& Y7 {) V- H" e2 z6 }  i0 b9 t/ ~
但是对于非程序员来说,我多说两句,跳转表是为了快速定位数据不需要从上到下循环搜索的。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート# q+ W. V" V# P
你可以理解跳转表是连续的一堆信息。魔力私服,最新魔力宝贝私服技术交流: Q; d: \# n/ R
你的msg编号最大的如果是100000,那么程序启动的时候就会设定10万个连续的数据空间用来存放对应每个msg编号指向msg.txt的哪一行。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート6 p9 j' s1 C7 l& B
这样,当游戏里,需要调用到某个msg的时候(比如道具说明啊,npc对话啊,boss发言啊之类的). {- d$ p% @6 G% ]( R% W! o( w
它直接通过编号获取跳转表指向的msg行,获取到msg的内容。bbs.mocwww.com% t" W1 H" O* D# \
这就导致了一个问题,你要是把msg的最大编号设置成3亿多。。。。可想而知浪费了多少内存?
; n. O' W. `& g! G. z7 wbbs.mocwww.com—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート+ n7 C' O* W3 Q  L: x
data下的其它文档也是一样的道理。用编号,不要太任性。bbs.mocwww.com* P# p+ v% c% L" V0 y
魔力私服,最新魔力宝贝私服技术交流1 w0 Y# \! P5 c) k' Y0 ]
二:lua方面bbs.mocwww.com- X  h: U" l4 ^
lua方面最大的内存占用,应该就是table类型的反复释放和创建了。; B6 T/ e& @5 p6 W: d
因为没有深入阅读lua的代码bbs.mocwww.com/ q! D# m' ^1 z% x# G
所以对于lua的内存管理一直是很懵的。
0 C! d$ b0 J- A$ n; W& r! U3 l妖城在线论坛如果没有对内存占用比较敏感的话魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表& A! W  V2 x9 ^) F: |+ f
正常运行的服务器,一般都会给每个玩家登陆的时候,或者玩家某个行为的时候,创建一个临时的tabble
* G9 o3 P3 @$ }& ~& b0 }7 ybbs.mocwww.com这个table的生命周期仅限于这玩家本次登录的时候。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表( _! L; S( u5 Q8 M- Q. Q. D/ C; H
然后玩家下线了,就释放掉,比如tablexx=nil. C: m8 z* M3 o6 k6 I- S& F
但是这样做有一个问题。。。魔力私服,最新魔力宝贝私服技术交流- E) ^& q% B7 |5 w3 e' l2 a$ ^! o
你可以尝试一个玩家登陆的时候,你创建一个百万级别的table项目。
( G- E8 l5 I8 C- V% Y- z3 S* _妖城在线论坛玩家下线的时候,你nil掉这个table妖城在线论坛1 o% }. K$ T+ J* q4 R
并且你也可以及时得使用lua的垃圾回收释放无效的内存。* g4 h0 g- E: N
但问题是,你垃圾回收后,你读取lua的占用内存,发现确实下降了bbs.mocwww.com7 n3 r/ p2 l  ?4 G* @* f9 u; H
但是在linux下用系统命令top查看。。。。。
1 v& [/ X2 z2 ~2 a2 q9 @—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート魔力服务端所占用的内存毫无下降。
4 u( p# |9 J1 T% t, ~8 w1 b; O* Y魔力私服,最新魔力宝贝私服技术交流那么你再次登陆角色,又创建了一批内存& P9 D# F2 n: ~6 ~  ^1 I
我至今依然没有通读lua引擎的代码,所以依然不能确定lua的内存管理方式。
9 |; x! Z3 s1 N. F1 R妖城在线论坛但是根据这段时间的测试
4 n  u9 C/ D  ~* O/ V' S! O3 G魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表可以总结经验(并不一定对):lua会霸占整个系统的内存,并以你目前最大用到的多少为限,你用lua的垃圾回收功能,是回收了魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表3 T! R. m4 G7 S3 D+ o, N, S' S" [0 T
但是这部分内存并不归还给linux系统
) v, J- v9 u9 I4 k/ l& tlua会认为,你既然现在能用到这个尺度的内存,那我留着,你等下迟早也要用到。。。。。
/ w" D2 ^1 S4 w  C; }bbs.mocwww.com这就导致了,不停的table的nil释放并不能真正释放整个魔力服务端运行时占用的内存9 ~! ~. p) M. j
这个跟正常的编程意识就有点不符合了。。。。。。
6 Z( ]" f7 [2 d8 Z* M5 mbbs.mocwww.com但反正它大概是这么操作的。bbs.mocwww.com: e* E& @, [9 a( H
解决方案是什么呢?
5 G5 w  R+ |7 L0 a8 [1 d—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート不要用cdkey啥的做table的key(如果非要不可,我感觉宁愿弄成field存到数据库中)
$ n2 i0 n" Z2 I- \+ ?9 [# _启动的时候,根据当前设定的最大在线人数,预先扩充一个table
! [* p6 h" }* b( t' t/ x% b) ?' X0 b妖城在线论坛这个table的索引key使用CharIndex这个序号妖城在线论坛" @7 O1 s) V! F$ A# ]
玩家下线的时候,不要nil掉,只要再次初始化数据就好了。
: t+ H; z  v; tbbs.mocwww.com这样就不会反复创建了
% U6 f# _$ i- [1 ~$ B& A—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート6 g. l& \9 \- e6 x
三:引擎,c语言方面魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表. ^! k4 X. p  S5 y2 G( }
也是同样的观点。
9 ^% |: L! s; z尽量预设开辟一段既定的内存空间,不要试图去在登陆和登出的时候频繁的创建和释放
' B' o  \9 D9 M$ T7 c& Y) vbbs.mocwww.com
) ?0 j7 l# n. T. m4 e& sbbs.mocwww.com最初妖城启动占用内存大概2.3g,运行大概十天半个月后,就会出现内存溢出,轻则挂端重则回档。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表3 c% O) R( h, O, D4 l
后来优化后(其实没有优化到极致)启动占用内存800m左右,干净的系统top下观察占用内存1g而已魔力私服,最新魔力宝贝私服技术交流+ Y' Q; S- C, F4 w4 y
连续运行几个月都不会有问题。
. J1 J5 z$ N8 J7 t魔力私服,最新魔力宝贝私服技术交流
: H8 k5 l4 e. q- |6 ^  E  T: r魔力私服,最新魔力宝贝私服技术交流以上说的三个方面
) l& w0 m' y7 y4 q两个都是一般的开服的gm自己可以控制优化的,第三个是必须引擎技术商方面优化的。! h+ N0 K" D' g3 n: g
妖城在线论坛6 z+ w9 g" f3 j: @) C1 h
大家可以试一下
妖城欢迎您!

TOP

补充几点—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート/ j( v1 E" Q9 f& K6 I
1. 关于可用内存,实际上linux上面只有3g,windows下面只有2g魔力私服,最新魔力宝贝私服技术交流# J2 n% I8 ^7 t$ D  W2 ~- G
2. luajit 可用内存是2g,除非 64位+GC64模式
: H0 g2 k8 b0 k/ [$ q5 d魔力私服,最新魔力宝贝私服技术交流2.1. 内存回收,lua 申请的内存看luajit的实现了,默认跟c一样的处理逻辑,但如果是myalloc的话,大概率会有内存泄漏,不过就算是c的内存申请后也不是马上归回系统的。妖城在线论坛% i2 ?; g7 U! o
3. gmsv里面动态申请的数据主要是迷宫,不过引擎的myalloc,大概率会有内存泄漏
8 @  H2 O+ f9 v' F: c# m$ h% Z魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表
( N+ D) ?& a+ }! C# q3 Hbbs.mocwww.com[ 本帖最后由 Muscipular 于 2023-5-15 12:40 编辑 ]

TOP

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

TOP

发新话题