关于服务端内存优化的一些经验
大家也知道,妖城魔力一个区开服了十周年多了魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表 I& @4 b* } X
2 J$ a* [# A. J) Z妖城在线论坛不管是数据库还是data的冗余肯定都非常多。妖城在线论坛0 L2 u$ k5 l& ]; ~6 ^1 A
$ l' |* Q7 d' G* H$ T对于妖城这样的数据量大的服务器,首先数据库肯定不能放在跟服务端运行的同一个服务器里。bbs.mocwww.com N& z) k2 u/ P( @
1 k$ n) t8 v3 e# Y, F, b这是基本的,所以,最好是运行服务端的服务器一台,数据库单独一台。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート4 a" d4 u- v: n5 i/ G8 P' N& a
3 t; m& o1 j6 v: v* l3 D3 G& Y. }6 {7 k
因为数据库大了之后,mysql的资源占用也是很可观的。能省则省。魔力私服,最新魔力宝贝私服技术交流0 H N4 \8 h/ J1 z: F
: I5 j* D/ e8 u+ X3 |魔力私服,最新魔力宝贝私服技术交流然后关于在有限资源的前提下(魔力原生的服务端是只能运行32位系统的,也就是最大4g内存,后续可能有别的引擎升级兼容了64位那另说)bbs.mocwww.com P7 `! W1 K# C+ d0 f' w; u& y+ s
: p1 ~/ a c3 r1 i% s0 r% [魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表优化有两个方面' j7 L1 O( T! B: @' _0 ]
一:data方面
9 }7 ~4 P8 L3 s: ]魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表data下几乎所有的txt设定,比如npc/msg/itemset/enemy等等9 A4 o% n- I# M- p
记住编号不要随意乱设置,尽量往小的,没用到的设定—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート8 \2 M5 n) F+ z9 M. S
比如你不要把一个msg的编号设定成390000000,三亿多了
2 p# ^+ ~+ J8 X! H2 a—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート因为在程序的逻辑里,我不可能为了寻找到某个编号,就每次去整个msg里面从上到下循环搜索吧?妖城在线论坛& _, d# |4 K2 k& w: b+ w, s( t7 B
所以程序逻辑,会在服务端启动的时候,就根据你msg的最大编号为上限,设定一个跳转表。魔力私服,最新魔力宝贝私服技术交流/ F% f8 r2 i# S `0 T/ V6 B
对程序员来说,讲到这里应该就懂了魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表+ p2 v* ?' w/ Y9 l! d
但是对于非程序员来说,我多说两句,跳转表是为了快速定位数据不需要从上到下循环搜索的。
; o8 t+ W1 |6 ?7 L: @你可以理解跳转表是连续的一堆信息。
3 E- H( ?$ B5 wbbs.mocwww.com你的msg编号最大的如果是100000,那么程序启动的时候就会设定10万个连续的数据空间用来存放对应每个msg编号指向msg.txt的哪一行。
7 Z# B5 L# Z& i4 X; K这样,当游戏里,需要调用到某个msg的时候(比如道具说明啊,npc对话啊,boss发言啊之类的)
5 g$ \" E& z n5 b5 C魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表它直接通过编号获取跳转表指向的msg行,获取到msg的内容。妖城在线论坛3 Y7 f1 P0 _) r: S( L
这就导致了一个问题,你要是把msg的最大编号设置成3亿多。。。。可想而知浪费了多少内存?/ ?% f# R5 e5 @) v$ b! \9 E) I* y
% k _1 C7 P0 S$ q* v魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表data下的其它文档也是一样的道理。用编号,不要太任性。
+ b/ p( @2 T- }& j
( H3 a( q9 U2 t6 C( w5 s% v妖城在线论坛二:lua方面
( \* y$ t) S7 {" n妖城在线论坛lua方面最大的内存占用,应该就是table类型的反复释放和创建了。
/ ]# Q: U9 y, t5 _2 ibbs.mocwww.com因为没有深入阅读lua的代码
- N. n: V+ f5 F \* p( k—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート所以对于lua的内存管理一直是很懵的。bbs.mocwww.com5 R! V# u" r U( W
如果没有对内存占用比较敏感的话4 D7 A7 b3 t! P# {
正常运行的服务器,一般都会给每个玩家登陆的时候,或者玩家某个行为的时候,创建一个临时的tabble
, O) z Q) W- O7 }—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート这个table的生命周期仅限于这玩家本次登录的时候。bbs.mocwww.com, r, E7 a* a) ^& g; R+ C
然后玩家下线了,就释放掉,比如tablexx=nil魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表# S' P# T6 J* d8 a8 P/ G
但是这样做有一个问题。。。
& | P1 q, O) a4 b$ b魔力私服,最新魔力宝贝私服技术交流你可以尝试一个玩家登陆的时候,你创建一个百万级别的table项目。
4 F0 z8 }3 X# M! |—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート玩家下线的时候,你nil掉这个table
5 o( B& ]$ ~) U% w妖城在线论坛并且你也可以及时得使用lua的垃圾回收释放无效的内存。魔力私服,最新魔力宝贝私服技术交流5 U: J' { o# c6 x% S8 I2 @) k5 w
但问题是,你垃圾回收后,你读取lua的占用内存,发现确实下降了
& o# q6 h% P# |# j) c) ]—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート但是在linux下用系统命令top查看。。。。。
; W* J; r4 q8 t* l7 V& [—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート魔力服务端所占用的内存毫无下降。bbs.mocwww.com1 ]& N5 V: [" G1 }( S
那么你再次登陆角色,又创建了一批内存
; ~! T" V' \5 B' N) @. X4 J5 a2 J妖城在线论坛我至今依然没有通读lua引擎的代码,所以依然不能确定lua的内存管理方式。魔力私服,最新魔力宝贝私服技术交流! W' M% [# G8 w$ J
但是根据这段时间的测试妖城在线论坛# V$ `& h) y; }0 W5 L7 n
可以总结经验(并不一定对):lua会霸占整个系统的内存,并以你目前最大用到的多少为限,你用lua的垃圾回收功能,是回收了
6 h7 \* {# R# ]: F; L. J魔力私服,最新魔力宝贝私服技术交流但是这部分内存并不归还给linux系统妖城在线论坛' x4 p8 y' c- @$ Y7 c
lua会认为,你既然现在能用到这个尺度的内存,那我留着,你等下迟早也要用到。。。。。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート4 c0 Y2 z; O8 e% _
这就导致了,不停的table的nil释放并不能真正释放整个魔力服务端运行时占用的内存—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート9 i. _: [1 {' j* E+ }" c4 B5 M F
这个跟正常的编程意识就有点不符合了。。。。。。
! n2 X0 O3 l0 n7 h魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表但反正它大概是这么操作的。
5 @: \/ n: s& Q- t6 O魔力私服,最新魔力宝贝私服技术交流解决方案是什么呢?—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート/ F+ {: x A- X. _, E( }4 ~1 \* I7 Q
不要用cdkey啥的做table的key(如果非要不可,我感觉宁愿弄成field存到数据库中)
: }: b+ G3 s- z4 }妖城在线论坛启动的时候,根据当前设定的最大在线人数,预先扩充一个table
4 P5 \3 e/ J2 ~/ u! q& S2 A—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート这个table的索引key使用CharIndex这个序号魔力私服,最新魔力宝贝私服技术交流# n J9 S) U% E( v# g* W w& V
玩家下线的时候,不要nil掉,只要再次初始化数据就好了。
5 z9 C1 l* {4 q4 }+ ]这样就不会反复创建了魔力私服,最新魔力宝贝私服技术交流% R- D) l0 X) Y& o6 N7 \* P8 s3 J$ {
6 m: ]; P; e( v {; t—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート三:引擎,c语言方面
2 w9 ^8 H. M7 G# ?# t F妖城在线论坛也是同样的观点。魔力私服,最新魔力宝贝私服技术交流( _ R; @5 c3 Q7 a% P$ @
尽量预设开辟一段既定的内存空间,不要试图去在登陆和登出的时候频繁的创建和释放
, t3 G/ ?5 o) O9 ?9 m( j
8 B9 {0 J6 p1 a. i. Z, N, T8 T妖城在线论坛最初妖城启动占用内存大概2.3g,运行大概十天半个月后,就会出现内存溢出,轻则挂端重则回档。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表6 e% x2 P m% ~- R4 d) g5 N) o0 e% k
后来优化后(其实没有优化到极致)启动占用内存800m左右,干净的系统top下观察占用内存1g而已
@' p! ]" a1 }# l: {bbs.mocwww.com连续运行几个月都不会有问题。
1 z- Q a/ A: Q! ]bbs.mocwww.com
+ g7 d" i" J+ W$ Y# h魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表以上说的三个方面bbs.mocwww.com) U( w/ p: e9 \6 Z0 f! Q9 C
两个都是一般的开服的gm自己可以控制优化的,第三个是必须引擎技术商方面优化的。
j. f' d1 K9 k1 P: R. z—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート魔力私服,最新魔力宝贝私服技术交流: w$ K) ?4 K1 c5 [
大家可以试一下