关于服务端内存优化的一些经验
大家也知道,妖城魔力一个区开服了十周年多了
5 T& s6 l. S+ c& j( s: Z) Rbbs.mocwww.com2 R; W/ d$ Q: [3 i/ N+ p
不管是数据库还是data的冗余肯定都非常多。妖城在线论坛: X9 v' T* ?- {: i k' f- l' U
* I6 d/ s# T" U' v4 R, Vbbs.mocwww.com对于妖城这样的数据量大的服务器,首先数据库肯定不能放在跟服务端运行的同一个服务器里。魔力私服,最新魔力宝贝私服技术交流# w% \4 y1 ~) p; A4 `9 N
+ m# c `2 l, V- @, |9 F—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート这是基本的,所以,最好是运行服务端的服务器一台,数据库单独一台。魔力私服,最新魔力宝贝私服技术交流' G% T' P3 H! G* Q) V6 i: [
8 `' C% f1 k6 j因为数据库大了之后,mysql的资源占用也是很可观的。能省则省。
* |8 h! j N4 F2 o6 {—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート6 {2 n& t* c* A: D+ c6 E5 D3 i/ z
然后关于在有限资源的前提下(魔力原生的服务端是只能运行32位系统的,也就是最大4g内存,后续可能有别的引擎升级兼容了64位那另说)
: @- c. h& y& ^ A0 M0 R: k魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表
( g# s' k: k; W5 I, e—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート优化有两个方面
6 R! d) o2 i) G" n7 obbs.mocwww.com一:data方面
7 b" _4 o% _4 S% M( ubbs.mocwww.comdata下几乎所有的txt设定,比如npc/msg/itemset/enemy等等bbs.mocwww.com& k6 S' {0 U! T. a3 s! E; ?& e
记住编号不要随意乱设置,尽量往小的,没用到的设定
6 m: k( [' M B3 v t1 C; X魔力私服,最新魔力宝贝私服技术交流比如你不要把一个msg的编号设定成390000000,三亿多了魔力私服,最新魔力宝贝私服技术交流+ T4 @# v" c M; l" k3 l" W
因为在程序的逻辑里,我不可能为了寻找到某个编号,就每次去整个msg里面从上到下循环搜索吧?
" r, ^" V/ {2 B( ?2 u% w所以程序逻辑,会在服务端启动的时候,就根据你msg的最大编号为上限,设定一个跳转表。
* g) r4 B' f! Y魔力私服,最新魔力宝贝私服技术交流对程序员来说,讲到这里应该就懂了魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表6 A8 h. n) U A" u4 {0 F
但是对于非程序员来说,我多说两句,跳转表是为了快速定位数据不需要从上到下循环搜索的。bbs.mocwww.com2 C- N: \* }# \0 Q; {" [% U) S
你可以理解跳转表是连续的一堆信息。妖城在线论坛6 Z+ u9 |$ {) O) V7 U
你的msg编号最大的如果是100000,那么程序启动的时候就会设定10万个连续的数据空间用来存放对应每个msg编号指向msg.txt的哪一行。
5 v% e# W' A$ s! J. {; z# U妖城在线论坛这样,当游戏里,需要调用到某个msg的时候(比如道具说明啊,npc对话啊,boss发言啊之类的)
! s6 ?- k2 b' V* j妖城在线论坛它直接通过编号获取跳转表指向的msg行,获取到msg的内容。
) e ?) j4 T* }& Q3 vbbs.mocwww.com这就导致了一个问题,你要是把msg的最大编号设置成3亿多。。。。可想而知浪费了多少内存?妖城在线论坛& P4 W+ v) n: s
妖城在线论坛" A% N8 I# x% T1 F5 x7 @: T+ L
data下的其它文档也是一样的道理。用编号,不要太任性。妖城在线论坛) s9 o: ]" o1 q& M0 g8 b
; h) V! C; Q9 p" p. `—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート二:lua方面—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート1 E5 E& ?6 E+ V8 T7 F5 r4 M \; c/ [
lua方面最大的内存占用,应该就是table类型的反复释放和创建了。
8 J6 p3 O2 i. K妖城在线论坛因为没有深入阅读lua的代码妖城在线论坛2 L" T& Y; u S: l3 I5 E. s
所以对于lua的内存管理一直是很懵的。bbs.mocwww.com. |0 O& A, D/ v% _3 e) i5 e( `5 C
如果没有对内存占用比较敏感的话bbs.mocwww.com- e5 b& {! N. |+ |; t4 R
正常运行的服务器,一般都会给每个玩家登陆的时候,或者玩家某个行为的时候,创建一个临时的tabble
+ j; F7 e0 ?( s' c: X1 o3 X—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート这个table的生命周期仅限于这玩家本次登录的时候。* x* i: p1 i; W2 Y
然后玩家下线了,就释放掉,比如tablexx=nilbbs.mocwww.com$ v1 A" I2 s+ w: W& w
但是这样做有一个问题。。。$ q6 I5 k' T+ o- _
你可以尝试一个玩家登陆的时候,你创建一个百万级别的table项目。
/ k" C4 h: s4 O) \, ]魔力私服,最新魔力宝贝私服技术交流玩家下线的时候,你nil掉这个table
. e! z. H {) o$ T% A) `6 _bbs.mocwww.com并且你也可以及时得使用lua的垃圾回收释放无效的内存。
( g- N# I: `. l0 T5 W6 j魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表但问题是,你垃圾回收后,你读取lua的占用内存,发现确实下降了妖城在线论坛3 d" H% p8 {; ?! {$ |
但是在linux下用系统命令top查看。。。。。. x9 s- E. G6 I5 s8 t
魔力服务端所占用的内存毫无下降。
$ ]3 J C& ?" J/ y1 J—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート那么你再次登陆角色,又创建了一批内存
; o7 t7 y/ \- ~) P$ k1 z/ @—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート我至今依然没有通读lua引擎的代码,所以依然不能确定lua的内存管理方式。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表. } g2 [% d, E% Q2 s `6 h! a- o* b
但是根据这段时间的测试
4 J7 z2 o, t( S* @) W h可以总结经验(并不一定对):lua会霸占整个系统的内存,并以你目前最大用到的多少为限,你用lua的垃圾回收功能,是回收了—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート! n# N* g: ^: `9 _2 c: l* ]# ^/ ?: H
但是这部分内存并不归还给linux系统bbs.mocwww.com$ ~' M, T. I" t( w! J3 l
lua会认为,你既然现在能用到这个尺度的内存,那我留着,你等下迟早也要用到。。。。。
/ i/ f! E5 p9 G4 qbbs.mocwww.com这就导致了,不停的table的nil释放并不能真正释放整个魔力服务端运行时占用的内存
/ y5 o# B' X" T9 f( ?/ F$ x0 |这个跟正常的编程意识就有点不符合了。。。。。。bbs.mocwww.com0 X% |" t/ O t+ E6 r, p
但反正它大概是这么操作的。
* \; c g8 k: f$ r- t) ?妖城在线论坛解决方案是什么呢?妖城在线论坛4 B# n' E& U9 ]2 W/ o: G
不要用cdkey啥的做table的key(如果非要不可,我感觉宁愿弄成field存到数据库中)—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート6 C- W1 N* ]: t; t
启动的时候,根据当前设定的最大在线人数,预先扩充一个table
9 O- O0 ^8 I6 Y) f4 k2 s3 {) wbbs.mocwww.com这个table的索引key使用CharIndex这个序号bbs.mocwww.com3 d/ Y$ D3 p0 o
玩家下线的时候,不要nil掉,只要再次初始化数据就好了。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表1 o8 k% H- y# h( Y
这样就不会反复创建了
7 }( ? Z3 D6 \bbs.mocwww.com
, @" f, |; C, {0 d; E% s0 B魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表三:引擎,c语言方面
% r* P4 c$ E- f0 L/ ?0 O魔力私服,最新魔力宝贝私服技术交流也是同样的观点。bbs.mocwww.com7 h5 M1 L/ i$ L/ z% C: q( [9 D: A
尽量预设开辟一段既定的内存空间,不要试图去在登陆和登出的时候频繁的创建和释放: [( x4 [! ^. F. v
3 c6 w% D9 H" T" D1 C+ l9 {—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート最初妖城启动占用内存大概2.3g,运行大概十天半个月后,就会出现内存溢出,轻则挂端重则回档。
* J! y# B/ g& r# {4 \! ~5 ]+ f后来优化后(其实没有优化到极致)启动占用内存800m左右,干净的系统top下观察占用内存1g而已
6 u3 O# K! a7 Obbs.mocwww.com连续运行几个月都不会有问题。
$ ~% S! C' H1 m9 n8 z妖城在线论坛
( R2 t( n& |" S& g8 z: h" H9 K魔力私服,最新魔力宝贝私服技术交流以上说的三个方面—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート* G- V& Z9 I# t$ T$ t
两个都是一般的开服的gm自己可以控制优化的,第三个是必须引擎技术商方面优化的。
3 S) E) a3 S$ t0 s8 p( Zbbs.mocwww.com5 }$ }5 R* X+ F8 F. L6 J' t
大家可以试一下