关于服务端内存优化的一些经验
大家也知道,妖城魔力一个区开服了十周年多了—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート) e/ P) z' V1 n7 _# @( R) y7 ]; ?' e4 Q( [
妖城在线论坛7 N# j4 W, ?8 v8 y
不管是数据库还是data的冗余肯定都非常多。
! }" [; |6 Y4 S8 L! Z妖城在线论坛妖城在线论坛3 h: u! S: @3 L! ?
对于妖城这样的数据量大的服务器,首先数据库肯定不能放在跟服务端运行的同一个服务器里。
! q9 `/ b+ K" c' Q* ~0 `" T魔力私服,最新魔力宝贝私服技术交流妖城在线论坛- b8 u) E |: W4 p/ {6 x
这是基本的,所以,最好是运行服务端的服务器一台,数据库单独一台。
' J) W' U* }' @# w9 b妖城在线论坛
% x6 @' \) e# a" m+ q* }# M; [魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表因为数据库大了之后,mysql的资源占用也是很可观的。能省则省。妖城在线论坛3 h6 ~& T" o* |8 P% J% [, y) h
; N; U; W2 \2 i/ l8 r/ P3 C妖城在线论坛然后关于在有限资源的前提下(魔力原生的服务端是只能运行32位系统的,也就是最大4g内存,后续可能有别的引擎升级兼容了64位那另说)
6 I9 H0 q- N( B8 y4 Z4 g魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表
4 d$ Y R" y5 a5 t—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート优化有两个方面
: Q! \ y* U5 u: Y0 V& T. C- [bbs.mocwww.com一:data方面
6 y! X. W$ S5 T {* O9 q魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表data下几乎所有的txt设定,比如npc/msg/itemset/enemy等等魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表6 Z8 q( y: q( H% r
记住编号不要随意乱设置,尽量往小的,没用到的设定
) ]# I' J% T% a魔力私服,最新魔力宝贝私服技术交流比如你不要把一个msg的编号设定成390000000,三亿多了
9 Z7 v" t0 a7 }- n' mbbs.mocwww.com因为在程序的逻辑里,我不可能为了寻找到某个编号,就每次去整个msg里面从上到下循环搜索吧?魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表/ \- w/ B6 r9 @" u1 h
所以程序逻辑,会在服务端启动的时候,就根据你msg的最大编号为上限,设定一个跳转表。魔力私服,最新魔力宝贝私服技术交流! W/ }" P# s5 Z8 k5 i) ~9 t# L: n
对程序员来说,讲到这里应该就懂了
; j8 }) B1 S/ j* _2 J( qbbs.mocwww.com但是对于非程序员来说,我多说两句,跳转表是为了快速定位数据不需要从上到下循环搜索的。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表! p, u+ J' e+ ?8 s# J2 u; E; b
你可以理解跳转表是连续的一堆信息。
3 W, E& H$ |% m2 G j; v8 P# d8 d妖城在线论坛你的msg编号最大的如果是100000,那么程序启动的时候就会设定10万个连续的数据空间用来存放对应每个msg编号指向msg.txt的哪一行。
8 V- g. J: _* i/ H+ Obbs.mocwww.com这样,当游戏里,需要调用到某个msg的时候(比如道具说明啊,npc对话啊,boss发言啊之类的)
% C0 k+ V0 G$ j( @它直接通过编号获取跳转表指向的msg行,获取到msg的内容。4 N7 R8 L" P1 M( j0 U9 o+ u2 z0 F
这就导致了一个问题,你要是把msg的最大编号设置成3亿多。。。。可想而知浪费了多少内存?
* \" u: G' x1 j" V: ]1 P+ }—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート妖城在线论坛2 B+ u. L' W0 u: B# g1 s* @& ~
data下的其它文档也是一样的道理。用编号,不要太任性。
! h- W# J% w9 d/ n; f# w8 E F) p9 L- H, A1 O1 A b8 c
二:lua方面
. k& q! u3 V; T. y- mbbs.mocwww.comlua方面最大的内存占用,应该就是table类型的反复释放和创建了。bbs.mocwww.com' B( \# X2 }% P6 r& p6 h2 y
因为没有深入阅读lua的代码
: T6 W. \6 g7 p9 Q* d' t* C所以对于lua的内存管理一直是很懵的。魔力私服,最新魔力宝贝私服技术交流7 Z# q* V, O# M9 L
如果没有对内存占用比较敏感的话
. g/ V+ `3 M& p5 p1 T( U" X魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表正常运行的服务器,一般都会给每个玩家登陆的时候,或者玩家某个行为的时候,创建一个临时的tabble—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート' a9 x( z" P' s
这个table的生命周期仅限于这玩家本次登录的时候。
. V# W7 o q* @# d- m6 f—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート然后玩家下线了,就释放掉,比如tablexx=nil
( u. }+ x, z q, I魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表但是这样做有一个问题。。。
! W6 _+ V: P+ P: u n/ g/ I—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート你可以尝试一个玩家登陆的时候,你创建一个百万级别的table项目。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート* p; G8 y: l$ n D/ ?
玩家下线的时候,你nil掉这个table
5 w- F4 j- I0 B% X/ t—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート并且你也可以及时得使用lua的垃圾回收释放无效的内存。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート& Z& o; j# u; j; o3 t
但问题是,你垃圾回收后,你读取lua的占用内存,发现确实下降了
7 N5 @+ V/ u0 X1 }# z6 Q. r魔力私服,最新魔力宝贝私服技术交流但是在linux下用系统命令top查看。。。。。
$ w: W6 i: Z! w, w( ^2 {3 h8 D" D魔力服务端所占用的内存毫无下降。
+ |# B+ h: {: E( ^* D妖城在线论坛那么你再次登陆角色,又创建了一批内存
# g1 E# y' U6 ?( G% z8 G4 i4 _+ _妖城在线论坛我至今依然没有通读lua引擎的代码,所以依然不能确定lua的内存管理方式。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート. r" a: J( s+ Y1 @+ o }3 x9 c
但是根据这段时间的测试
# k* [- U! k: f& p# n0 o5 z& y9 M妖城在线论坛可以总结经验(并不一定对):lua会霸占整个系统的内存,并以你目前最大用到的多少为限,你用lua的垃圾回收功能,是回收了妖城在线论坛0 A' j# v# n/ z3 o K1 @7 c
但是这部分内存并不归还给linux系统魔力私服,最新魔力宝贝私服技术交流/ K; v3 g6 K& B, R
lua会认为,你既然现在能用到这个尺度的内存,那我留着,你等下迟早也要用到。。。。。
9 d# {' R% _% q5 Q; \这就导致了,不停的table的nil释放并不能真正释放整个魔力服务端运行时占用的内存
1 J, Q: K5 A. i, C3 d/ o这个跟正常的编程意识就有点不符合了。。。。。。1 ?8 M1 x) F# A( ~& D% |
但反正它大概是这么操作的。bbs.mocwww.com6 @" k* F: Z1 F R
解决方案是什么呢?
9 w( o2 z) p" P* a妖城在线论坛不要用cdkey啥的做table的key(如果非要不可,我感觉宁愿弄成field存到数据库中)
: h0 T$ ^$ Y( h5 ]7 c* Q; ^启动的时候,根据当前设定的最大在线人数,预先扩充一个table
8 ~9 a' F' P5 s+ b—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート这个table的索引key使用CharIndex这个序号魔力私服,最新魔力宝贝私服技术交流4 Q2 X+ d. W! t5 U0 ?
玩家下线的时候,不要nil掉,只要再次初始化数据就好了。
4 w8 `. Z4 L$ l4 b魔力私服,最新魔力宝贝私服技术交流这样就不会反复创建了妖城在线论坛4 h' m& _. o% G* I5 m2 x
" O; _1 b! Z! y' {魔力私服,最新魔力宝贝私服技术交流三:引擎,c语言方面
4 @+ I+ C% m5 P- h8 B—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート也是同样的观点。
$ Q. y5 x t/ \ ?1 Ibbs.mocwww.com尽量预设开辟一段既定的内存空间,不要试图去在登陆和登出的时候频繁的创建和释放魔力私服,最新魔力宝贝私服技术交流3 E* F( Y' z7 ~3 E) ~
. W H: h: E$ G7 ] r& O/ O魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表最初妖城启动占用内存大概2.3g,运行大概十天半个月后,就会出现内存溢出,轻则挂端重则回档。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート. k) u& {- j$ K; d, H
后来优化后(其实没有优化到极致)启动占用内存800m左右,干净的系统top下观察占用内存1g而已
+ Q( o4 T7 M Z7 X" g7 U3 y魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表连续运行几个月都不会有问题。+ y. ~ q6 V+ J1 Z1 n! b* M4 E
, | N% M5 G% e! T( s, ?" |9 J魔力私服,最新魔力宝贝私服技术交流以上说的三个方面—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート+ u" V& x$ a4 f. @
两个都是一般的开服的gm自己可以控制优化的,第三个是必须引擎技术商方面优化的。魔力私服,最新魔力宝贝私服技术交流! `* Y+ p/ g6 C2 q; [/ ^
0 G1 U4 m) r" L3 B
大家可以试一下