发新话题
打印

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

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

大家也知道,妖城魔力一个区开服了十周年多了' {; u) I$ R; T
—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート+ Q+ j* Q/ l8 b! s* e% l& D' l
不管是数据库还是data的冗余肯定都非常多。
9 v# q) j2 l% N/ \, j—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲートbbs.mocwww.com8 A, N. Y) @1 z" R! k+ n$ V
对于妖城这样的数据量大的服务器,首先数据库肯定不能放在跟服务端运行的同一个服务器里。7 v/ K7 `) I- d, l4 `* o/ m
bbs.mocwww.com, P/ n0 P0 Z, B. a. i
这是基本的,所以,最好是运行服务端的服务器一台,数据库单独一台。
- Y- z. d  s% P% M( bbbs.mocwww.com
9 r0 d5 Y# K' |8 x; h- Cbbs.mocwww.com因为数据库大了之后,mysql的资源占用也是很可观的。能省则省。
$ ~* S$ A2 }4 I9 Xbbs.mocwww.com+ Q# `  V, E; G" Q1 x
然后关于在有限资源的前提下(魔力原生的服务端是只能运行32位系统的,也就是最大4g内存,后续可能有别的引擎升级兼容了64位那另说)妖城在线论坛5 Z  p) v& a& k+ |  u

0 G( G. i; V2 r魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表优化有两个方面
/ G. t2 i# u% m% T魔力私服,最新魔力宝贝私服技术交流一:data方面
9 u( e* N# A; X2 k8 L0 sdata下几乎所有的txt设定,比如npc/msg/itemset/enemy等等
6 @4 f( d5 M1 t  ?2 W0 t—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート记住编号不要随意乱设置,尽量往小的,没用到的设定) g6 ?7 R" k2 j7 _
比如你不要把一个msg的编号设定成390000000,三亿多了
0 _( j4 x2 I' ]( T6 U- x$ w5 t* [魔力私服,最新魔力宝贝私服技术交流因为在程序的逻辑里,我不可能为了寻找到某个编号,就每次去整个msg里面从上到下循环搜索吧?bbs.mocwww.com  y1 F2 ]/ C; p6 b  i* ]+ _6 l1 J
所以程序逻辑,会在服务端启动的时候,就根据你msg的最大编号为上限,设定一个跳转表。
6 Q0 \, ^: P" I魔力私服,最新魔力宝贝私服技术交流对程序员来说,讲到这里应该就懂了妖城在线论坛6 x( X2 c" @, |4 I$ w+ T4 I
但是对于非程序员来说,我多说两句,跳转表是为了快速定位数据不需要从上到下循环搜索的。
, P0 p; c: Z( I, q7 Q, V魔力私服,最新魔力宝贝私服技术交流你可以理解跳转表是连续的一堆信息。bbs.mocwww.com( T3 f) U) h/ o4 t) o; K/ n
你的msg编号最大的如果是100000,那么程序启动的时候就会设定10万个连续的数据空间用来存放对应每个msg编号指向msg.txt的哪一行。bbs.mocwww.com' c6 `# Y$ K' l, H
这样,当游戏里,需要调用到某个msg的时候(比如道具说明啊,npc对话啊,boss发言啊之类的)* b$ ^. n: x: C9 E" }( q
它直接通过编号获取跳转表指向的msg行,获取到msg的内容。魔力私服,最新魔力宝贝私服技术交流# E; W) Q: h9 H9 ~* k7 P$ f; E5 P- `
这就导致了一个问题,你要是把msg的最大编号设置成3亿多。。。。可想而知浪费了多少内存?; _6 a$ x5 Z1 @# S+ r4 F3 v

; G; M: H4 |" {魔力私服,最新魔力宝贝私服技术交流data下的其它文档也是一样的道理。用编号,不要太任性。
5 w( m( i; A( M! L( r, ~8 C! |
, y0 b$ Z0 q9 \" U& u二:lua方面
1 C+ G: c/ g: y7 a( H6 B& r% jbbs.mocwww.comlua方面最大的内存占用,应该就是table类型的反复释放和创建了。
& C, a1 W7 ~& v3 q. E0 f! O魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表因为没有深入阅读lua的代码
2 C, A: E9 m% [8 Ibbs.mocwww.com所以对于lua的内存管理一直是很懵的。; b4 U" ~' T( S( J# y/ |/ v
如果没有对内存占用比较敏感的话bbs.mocwww.com( p' j; p6 K- R: z$ g, k% \# v1 d
正常运行的服务器,一般都会给每个玩家登陆的时候,或者玩家某个行为的时候,创建一个临时的tabble
2 z8 y$ B( f! y8 C: Q. M+ c魔力私服,最新魔力宝贝私服技术交流这个table的生命周期仅限于这玩家本次登录的时候。
" o9 F. ?5 e8 W( C# A" u. j6 H魔力私服,最新魔力宝贝私服技术交流然后玩家下线了,就释放掉,比如tablexx=nil
& c: d" I2 A9 L& e  m* C3 h0 H( G魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表但是这样做有一个问题。。。
/ `3 M4 @5 A0 }" R你可以尝试一个玩家登陆的时候,你创建一个百万级别的table项目。bbs.mocwww.com: l5 |) r% X1 F
玩家下线的时候,你nil掉这个table
8 ?( H. T; K' I* `* s4 o8 h% sbbs.mocwww.com并且你也可以及时得使用lua的垃圾回收释放无效的内存。
1 {- F! ^. ]" P+ _, H* ^魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表但问题是,你垃圾回收后,你读取lua的占用内存,发现确实下降了魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表; n% h2 q" f' E" `
但是在linux下用系统命令top查看。。。。。bbs.mocwww.com% y& M5 m1 d$ l; v  p
魔力服务端所占用的内存毫无下降。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表) q; O" ?' F% q- o' l
那么你再次登陆角色,又创建了一批内存
$ C/ L4 I, k2 {$ |% g—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート我至今依然没有通读lua引擎的代码,所以依然不能确定lua的内存管理方式。bbs.mocwww.com: {! G9 O" ?. `) j$ \3 A6 G
但是根据这段时间的测试
6 {9 o% O- c, l, O+ c. |可以总结经验(并不一定对):lua会霸占整个系统的内存,并以你目前最大用到的多少为限,你用lua的垃圾回收功能,是回收了妖城在线论坛, V) S+ [! ]+ \: p& s" d$ l+ Q9 ?
但是这部分内存并不归还给linux系统bbs.mocwww.com  e6 l! u* w$ W! ?! T$ M0 ^
lua会认为,你既然现在能用到这个尺度的内存,那我留着,你等下迟早也要用到。。。。。
6 c: k# a) l) ], G1 }2 {妖城在线论坛这就导致了,不停的table的nil释放并不能真正释放整个魔力服务端运行时占用的内存—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート/ e6 t6 z5 p. B
这个跟正常的编程意识就有点不符合了。。。。。。
- A2 B4 C. q5 R' V$ }6 Q魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表但反正它大概是这么操作的。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート9 V, G+ e* V6 j+ h- |. N) h
解决方案是什么呢?# \* O9 l3 d9 r) z: K( c2 A
不要用cdkey啥的做table的key(如果非要不可,我感觉宁愿弄成field存到数据库中)
. W1 U! |0 g1 A% o( S& B4 Wbbs.mocwww.com启动的时候,根据当前设定的最大在线人数,预先扩充一个table魔力私服,最新魔力宝贝私服技术交流3 P- G2 K9 `, K, U! v3 p0 X
这个table的索引key使用CharIndex这个序号魔力私服,最新魔力宝贝私服技术交流) d! g. k# a' t2 U9 f
玩家下线的时候,不要nil掉,只要再次初始化数据就好了。妖城在线论坛" ~$ s8 B" h/ `6 m. i  r" c; d, s* k
这样就不会反复创建了魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表% Q( p! q: g; v2 w" r; }) c

" J, K8 |, j7 ~/ Y5 |! `9 u魔力私服,最新魔力宝贝私服技术交流三:引擎,c语言方面魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表# }7 W, f( D% i- z& D
也是同样的观点。妖城在线论坛- ]) O3 @1 J5 b' R
尽量预设开辟一段既定的内存空间,不要试图去在登陆和登出的时候频繁的创建和释放- y1 ^! v, s9 k+ z

9 K: z+ K6 u( s7 L" q2 t" L—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート最初妖城启动占用内存大概2.3g,运行大概十天半个月后,就会出现内存溢出,轻则挂端重则回档。
3 n4 j; n4 T' M8 K后来优化后(其实没有优化到极致)启动占用内存800m左右,干净的系统top下观察占用内存1g而已
/ H1 G% G! U. Y, ]7 Z0 J# ~妖城在线论坛连续运行几个月都不会有问题。
' W6 o6 j  {3 b5 `% g. s4 l/ ~bbs.mocwww.com
) g! X3 p  Y7 k6 C魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表以上说的三个方面
$ d/ [2 y: N' A+ L/ p妖城在线论坛两个都是一般的开服的gm自己可以控制优化的,第三个是必须引擎技术商方面优化的。妖城在线论坛5 `# [% m/ O  n' B' e$ L5 x+ @, M
魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表% [" G+ s( y1 K' q# U7 C# n4 q
大家可以试一下
妖城欢迎您!

TOP

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

TOP

发新话题