发新话题
打印

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

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

大家也知道,妖城魔力一个区开服了十周年多了+ X8 s. {$ C- H& K4 ~' E& L% f- y1 c

% n1 h( G" c! R! ]3 P5 c% x% t, ?! G魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表不管是数据库还是data的冗余肯定都非常多。
6 @0 m! C1 w: I& t/ d妖城在线论坛
8 P* T/ D; }% l' c—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート对于妖城这样的数据量大的服务器,首先数据库肯定不能放在跟服务端运行的同一个服务器里。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート8 q/ A3 |3 j& ~2 v8 F

3 d+ s" U4 w9 ^2 c! m: S. B& f! c—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート这是基本的,所以,最好是运行服务端的服务器一台,数据库单独一台。
' w1 A. I! j0 c- i4 h2 D  s魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表魔力私服,最新魔力宝贝私服技术交流8 X% ]8 [4 R: j
因为数据库大了之后,mysql的资源占用也是很可观的。能省则省。
3 D* t3 l6 ~8 ]* z8 ?魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表
* o7 D/ F$ M- D1 p+ f2 ?—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート然后关于在有限资源的前提下(魔力原生的服务端是只能运行32位系统的,也就是最大4g内存,后续可能有别的引擎升级兼容了64位那另说)
2 B0 ]/ i$ H! l+ T. m
: U6 Z) h. O9 U魔力私服,最新魔力宝贝私服技术交流优化有两个方面魔力私服,最新魔力宝贝私服技术交流/ e! O: d/ F% B1 d# j+ V8 ~
一:data方面
; ]) Z( q2 b3 F% g魔力私服,最新魔力宝贝私服技术交流data下几乎所有的txt设定,比如npc/msg/itemset/enemy等等& a$ b- v! ]' g1 A, S- T
记住编号不要随意乱设置,尽量往小的,没用到的设定bbs.mocwww.com2 [' h/ [0 c* Y2 O
比如你不要把一个msg的编号设定成390000000,三亿多了妖城在线论坛. G8 C: @0 N: h- W% c
因为在程序的逻辑里,我不可能为了寻找到某个编号,就每次去整个msg里面从上到下循环搜索吧?魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表, @4 m9 S& M3 l, g4 ^7 M! F  u
所以程序逻辑,会在服务端启动的时候,就根据你msg的最大编号为上限,设定一个跳转表。bbs.mocwww.com$ v1 ]  f6 o+ S6 o% Q
对程序员来说,讲到这里应该就懂了
4 R* w) C+ d& U  n. _7 Fbbs.mocwww.com但是对于非程序员来说,我多说两句,跳转表是为了快速定位数据不需要从上到下循环搜索的。
1 d3 D1 @$ i+ o$ F) _bbs.mocwww.com你可以理解跳转表是连续的一堆信息。
3 q" j+ c* W! }4 {' a& o( V: Ybbs.mocwww.com你的msg编号最大的如果是100000,那么程序启动的时候就会设定10万个连续的数据空间用来存放对应每个msg编号指向msg.txt的哪一行。
7 w; B& s' o; ]0 \9 k0 I7 t这样,当游戏里,需要调用到某个msg的时候(比如道具说明啊,npc对话啊,boss发言啊之类的)—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート1 {6 [8 X7 s9 m3 D6 E
它直接通过编号获取跳转表指向的msg行,获取到msg的内容。魔力私服,最新魔力宝贝私服技术交流6 Y) l8 E; j# L5 R; e2 U$ w7 r
这就导致了一个问题,你要是把msg的最大编号设置成3亿多。。。。可想而知浪费了多少内存?
& ^6 y! L  Y3 C0 U: Z" c魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表$ D) ^" l3 y4 I9 f2 S% L5 ]% h- j
data下的其它文档也是一样的道理。用编号,不要太任性。bbs.mocwww.com) z+ r/ a/ T. n

0 I; v1 d/ k: _8 h! D! X二:lua方面魔力私服,最新魔力宝贝私服技术交流' o) I: u# u) H6 [  @
lua方面最大的内存占用,应该就是table类型的反复释放和创建了。
( t% T6 D% z0 I5 U+ U1 i妖城在线论坛因为没有深入阅读lua的代码
8 i+ Z8 N. D- ]- M% k魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表所以对于lua的内存管理一直是很懵的。
) X- y9 w' j: w8 W如果没有对内存占用比较敏感的话—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート( `. j( }* i0 D6 G9 v- v& w
正常运行的服务器,一般都会给每个玩家登陆的时候,或者玩家某个行为的时候,创建一个临时的tabble
5 m8 T4 k! G6 s+ D" R! o魔力私服,最新魔力宝贝私服技术交流这个table的生命周期仅限于这玩家本次登录的时候。
- \0 d4 y+ |, z% @bbs.mocwww.com然后玩家下线了,就释放掉,比如tablexx=nil
5 E  P; f* M4 M1 ~: w* s, E8 Jbbs.mocwww.com但是这样做有一个问题。。。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表( U' a, l% W. a
你可以尝试一个玩家登陆的时候,你创建一个百万级别的table项目。
+ z: _7 d+ \/ K; H* Z3 [2 o妖城在线论坛玩家下线的时候,你nil掉这个table妖城在线论坛- s6 e! i, }7 i- [
并且你也可以及时得使用lua的垃圾回收释放无效的内存。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表/ s( x1 M: i  u$ R2 ?+ j/ R
但问题是,你垃圾回收后,你读取lua的占用内存,发现确实下降了6 y5 d# }  h. N8 \! \- ?9 h
但是在linux下用系统命令top查看。。。。。4 t4 c+ p* S+ v7 T5 v  f! U
魔力服务端所占用的内存毫无下降。; J/ M; d+ A) J* d2 J  H/ d
那么你再次登陆角色,又创建了一批内存
8 U3 {! X4 p# ~' I我至今依然没有通读lua引擎的代码,所以依然不能确定lua的内存管理方式。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表) ?# _: V7 j! O; G9 i6 Y& D- U
但是根据这段时间的测试—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート7 i) x4 G( d; R! d
可以总结经验(并不一定对):lua会霸占整个系统的内存,并以你目前最大用到的多少为限,你用lua的垃圾回收功能,是回收了
! I# m7 m+ v/ c( v7 S  u: e但是这部分内存并不归还给linux系统bbs.mocwww.com3 c3 l2 f2 t3 {- f2 [& ]
lua会认为,你既然现在能用到这个尺度的内存,那我留着,你等下迟早也要用到。。。。。
, d, q% E) ?4 }这就导致了,不停的table的nil释放并不能真正释放整个魔力服务端运行时占用的内存9 C- t3 t- `) w+ g
这个跟正常的编程意识就有点不符合了。。。。。。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表* `/ q/ r6 b. D. I1 {1 O. J
但反正它大概是这么操作的。魔力私服,最新魔力宝贝私服技术交流$ K2 f# m5 O) n4 e4 K
解决方案是什么呢?妖城在线论坛0 L/ M! q7 F4 ?5 v1 U, U& H
不要用cdkey啥的做table的key(如果非要不可,我感觉宁愿弄成field存到数据库中)
. u. U. _" K' h妖城在线论坛启动的时候,根据当前设定的最大在线人数,预先扩充一个table妖城在线论坛7 ~5 o* A+ _) O6 a, o" @
这个table的索引key使用CharIndex这个序号
! g& l, z# v. ~5 gbbs.mocwww.com玩家下线的时候,不要nil掉,只要再次初始化数据就好了。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート" I3 X) X: B  u1 H5 v
这样就不会反复创建了—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート5 g5 m( m; k) G- U' Q

( B- ?2 x" Z8 R( ]( A, Y% P魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表三:引擎,c语言方面
6 ^& v! H' i  Z' q2 S/ o+ }魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表也是同样的观点。
- }7 @7 l5 V' l4 x% Y7 P( K0 V尽量预设开辟一段既定的内存空间,不要试图去在登陆和登出的时候频繁的创建和释放妖城在线论坛) H( Q& g* ]: w! b
—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート: ?# k5 d! ]1 R& H( R( I) s
最初妖城启动占用内存大概2.3g,运行大概十天半个月后,就会出现内存溢出,轻则挂端重则回档。1 a) m* ~) w5 M1 R
后来优化后(其实没有优化到极致)启动占用内存800m左右,干净的系统top下观察占用内存1g而已
' {% {9 Q. p& W1 ]( v5 ?/ V魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表连续运行几个月都不会有问题。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート+ {, x5 a0 _  X4 D  u+ H0 M
魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表3 z! D3 c6 p1 c7 t+ n
以上说的三个方面
( @0 ?) `* C; c+ o. T- ^& r—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート两个都是一般的开服的gm自己可以控制优化的,第三个是必须引擎技术商方面优化的。
, R- z* P, f! q! B  j* zbbs.mocwww.com
8 F! w! U; Z4 ~& \/ o1 ?—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート大家可以试一下
妖城欢迎您!

TOP

补充几点0 n3 Y$ l, l6 @" J$ W- A6 Q
1. 关于可用内存,实际上linux上面只有3g,windows下面只有2g
/ m6 t( g' v4 _% Z" I魔力私服,最新魔力宝贝私服技术交流2. luajit 可用内存是2g,除非 64位+GC64模式
+ R3 k$ ]3 X+ A2 r+ Z魔力私服,最新魔力宝贝私服技术交流2.1. 内存回收,lua 申请的内存看luajit的实现了,默认跟c一样的处理逻辑,但如果是myalloc的话,大概率会有内存泄漏,不过就算是c的内存申请后也不是马上归回系统的。5 n* N% h* x0 B7 ^
3. gmsv里面动态申请的数据主要是迷宫,不过引擎的myalloc,大概率会有内存泄漏魔力私服,最新魔力宝贝私服技术交流* a, b) l) T+ \# U2 g, s' @. C, x
—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート9 G- A; X% A7 Q% ?/ E, R6 Y
[ 本帖最后由 Muscipular 于 2023-5-15 12:40 编辑 ]

TOP

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

TOP

发新话题