发新话题
打印

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

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

大家也知道,妖城魔力一个区开服了十周年多了4 x& V  L' l" H" H7 F

- j4 V) j$ q0 C9 Z2 A妖城在线论坛不管是数据库还是data的冗余肯定都非常多。
% v7 N3 m6 ^. U8 e- i5 {- L% X魔力私服,最新魔力宝贝私服技术交流2 A% H, O2 }7 R: u  Y
对于妖城这样的数据量大的服务器,首先数据库肯定不能放在跟服务端运行的同一个服务器里。
! n) t& l5 _7 X* V! P$ O# y妖城在线论坛
+ W- S  s8 {: Q1 g% J) Qbbs.mocwww.com这是基本的,所以,最好是运行服务端的服务器一台,数据库单独一台。
* ~, C& h- o0 ^/ |+ |魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表. J2 u9 l2 z2 L, p
因为数据库大了之后,mysql的资源占用也是很可观的。能省则省。
5 K; Q$ J; |1 m& r$ G# {  N% [" s) K
1 t/ t9 g$ r" y' V# @* [' c1 u然后关于在有限资源的前提下(魔力原生的服务端是只能运行32位系统的,也就是最大4g内存,后续可能有别的引擎升级兼容了64位那另说)
$ {; v6 F9 D4 |- |' s—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート
& ^' X0 j* ~/ s) E优化有两个方面
% m0 R! K2 N8 t$ A. Y" i魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表一:data方面魔力私服,最新魔力宝贝私服技术交流  D9 N, O7 L* f: P; v2 I
data下几乎所有的txt设定,比如npc/msg/itemset/enemy等等
2 c) n6 U2 o" a记住编号不要随意乱设置,尽量往小的,没用到的设定—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート: t6 Y: |& G, V$ ?$ ~0 }
比如你不要把一个msg的编号设定成390000000,三亿多了妖城在线论坛7 w1 ~- c$ z9 y* Y  o8 _
因为在程序的逻辑里,我不可能为了寻找到某个编号,就每次去整个msg里面从上到下循环搜索吧?
8 ?* o& ~  ?1 K4 P8 ^—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート所以程序逻辑,会在服务端启动的时候,就根据你msg的最大编号为上限,设定一个跳转表。
  ~& V' O2 Q3 t. V+ }$ s2 P魔力私服,最新魔力宝贝私服技术交流对程序员来说,讲到这里应该就懂了
8 T' S" n( T. q' |  P" D1 _妖城在线论坛但是对于非程序员来说,我多说两句,跳转表是为了快速定位数据不需要从上到下循环搜索的。
# c& V- O" k& X, Hbbs.mocwww.com你可以理解跳转表是连续的一堆信息。
# }, l% n2 D# [魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表你的msg编号最大的如果是100000,那么程序启动的时候就会设定10万个连续的数据空间用来存放对应每个msg编号指向msg.txt的哪一行。魔力私服,最新魔力宝贝私服技术交流" b  i* M3 Z5 H# e
这样,当游戏里,需要调用到某个msg的时候(比如道具说明啊,npc对话啊,boss发言啊之类的)
' d8 J6 _$ P2 G8 n9 K魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表它直接通过编号获取跳转表指向的msg行,获取到msg的内容。
' m' L6 @; }: w1 |, R$ V% E妖城在线论坛这就导致了一个问题,你要是把msg的最大编号设置成3亿多。。。。可想而知浪费了多少内存?魔力私服,最新魔力宝贝私服技术交流; x$ e5 K+ t3 |. {* S( i  q

% V" j3 a" B2 k3 D* X: t1 x( F1 [妖城在线论坛data下的其它文档也是一样的道理。用编号,不要太任性。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート3 ^7 ~( B' m6 A6 ]$ W

/ c* {# F) H7 F) N, I—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート二:lua方面bbs.mocwww.com4 R9 r/ P. w: i
lua方面最大的内存占用,应该就是table类型的反复释放和创建了。bbs.mocwww.com. P- o6 V6 c* W7 V! |  L" H7 n
因为没有深入阅读lua的代码
; @" _: Q4 u. p" h  n& a所以对于lua的内存管理一直是很懵的。
* D4 c! h, ^8 k, c3 h如果没有对内存占用比较敏感的话
5 W# ^5 A! z. Y& `- u5 d魔力私服,最新魔力宝贝私服技术交流正常运行的服务器,一般都会给每个玩家登陆的时候,或者玩家某个行为的时候,创建一个临时的tabble魔力私服,最新魔力宝贝私服技术交流- l5 F) Q5 J7 m" `  N& X+ @, k6 G
这个table的生命周期仅限于这玩家本次登录的时候。bbs.mocwww.com9 [' K* ~9 N# S6 g; ?
然后玩家下线了,就释放掉,比如tablexx=nil—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート; u3 o' B5 m6 v% W6 a. M
但是这样做有一个问题。。。
1 Z, i; B) j( ]) p* I3 A& F魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表你可以尝试一个玩家登陆的时候,你创建一个百万级别的table项目。
  `( \/ p0 p9 A; T/ N5 l玩家下线的时候,你nil掉这个table—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート" q  U. |, F' D6 G' R! f% a* |2 _
并且你也可以及时得使用lua的垃圾回收释放无效的内存。妖城在线论坛' T: {0 k; T# p7 N
但问题是,你垃圾回收后,你读取lua的占用内存,发现确实下降了魔力私服,最新魔力宝贝私服技术交流# g0 T! f+ M9 e9 H& m
但是在linux下用系统命令top查看。。。。。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート% _) C, p$ f- o5 I! |; b; q  C9 i1 @
魔力服务端所占用的内存毫无下降。
6 e/ y- E% y( c% @' F- C) h那么你再次登陆角色,又创建了一批内存魔力私服,最新魔力宝贝私服技术交流: \: W  g) F( n. L( `7 h7 O. m
我至今依然没有通读lua引擎的代码,所以依然不能确定lua的内存管理方式。
) l' b7 U3 s; _& R! k  l: Ibbs.mocwww.com但是根据这段时间的测试妖城在线论坛- `- Y8 e  ]8 T2 }( J: A
可以总结经验(并不一定对):lua会霸占整个系统的内存,并以你目前最大用到的多少为限,你用lua的垃圾回收功能,是回收了魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表* E% Q$ m- I8 V- w9 f) W* n9 q6 q6 R
但是这部分内存并不归还给linux系统
& x" D1 n7 i  w2 y) P0 I3 q# _" q—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲートlua会认为,你既然现在能用到这个尺度的内存,那我留着,你等下迟早也要用到。。。。。3 T* @1 ]; f1 ~  _! n1 r, L+ X
这就导致了,不停的table的nil释放并不能真正释放整个魔力服务端运行时占用的内存bbs.mocwww.com+ f& ~* Y  D- ]+ ]8 D
这个跟正常的编程意识就有点不符合了。。。。。。妖城在线论坛! R8 y7 ~- E4 M$ P! e+ j3 Q
但反正它大概是这么操作的。
# o6 U: `! \6 n. e解决方案是什么呢?魔力私服,最新魔力宝贝私服技术交流, \1 l  h6 [" L& O0 d
不要用cdkey啥的做table的key(如果非要不可,我感觉宁愿弄成field存到数据库中)# n& E! M  w7 d  q; \( Q' H
启动的时候,根据当前设定的最大在线人数,预先扩充一个table
6 x9 m6 m0 R- x) C( P+ Z# Z4 ]魔力私服,最新魔力宝贝私服技术交流这个table的索引key使用CharIndex这个序号
4 T% M3 M- U1 P: w7 L9 {" n妖城在线论坛玩家下线的时候,不要nil掉,只要再次初始化数据就好了。妖城在线论坛. H% H% o/ K* P
这样就不会反复创建了, u& g+ g3 g% G/ j" N
  Y; z+ [) a" |- M8 F  G
三:引擎,c语言方面
8 z1 J' c- o6 ?+ U—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート也是同样的观点。妖城在线论坛* I3 \& @) G( H9 b  @+ M) H
尽量预设开辟一段既定的内存空间,不要试图去在登陆和登出的时候频繁的创建和释放魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表3 i4 s# m  Z/ e* K

7 }3 o! g$ o0 r. P! y- y4 qbbs.mocwww.com最初妖城启动占用内存大概2.3g,运行大概十天半个月后,就会出现内存溢出,轻则挂端重则回档。
2 D; ]/ @; \( _2 }6 ^后来优化后(其实没有优化到极致)启动占用内存800m左右,干净的系统top下观察占用内存1g而已bbs.mocwww.com6 t1 {0 n/ g8 ~9 g: B$ r7 b
连续运行几个月都不会有问题。0 S  @/ N  D+ _# |( F% |% y

! G& G& p( `+ k7 l0 h% ]8 H8 @以上说的三个方面魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表, C( A! i5 W; o2 e
两个都是一般的开服的gm自己可以控制优化的,第三个是必须引擎技术商方面优化的。7 G$ U  D1 f0 b

% ~& t& L6 G& D  v' J) }妖城在线论坛大家可以试一下
妖城欢迎您!

TOP

补充几点妖城在线论坛  m$ ^/ y* `* t7 n& E1 g4 m
1. 关于可用内存,实际上linux上面只有3g,windows下面只有2g
1 }" [' x9 ?- c* N% f. I魔力私服,最新魔力宝贝私服技术交流2. luajit 可用内存是2g,除非 64位+GC64模式- {3 v$ Y) z- S9 y9 H
2.1. 内存回收,lua 申请的内存看luajit的实现了,默认跟c一样的处理逻辑,但如果是myalloc的话,大概率会有内存泄漏,不过就算是c的内存申请后也不是马上归回系统的。
- L+ U6 M2 h4 e9 `  Cbbs.mocwww.com3. gmsv里面动态申请的数据主要是迷宫,不过引擎的myalloc,大概率会有内存泄漏妖城在线论坛3 U% S9 m/ @/ I2 q1 H2 @2 U

+ S1 _1 q4 B) Y) O) @) [' `魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表[ 本帖最后由 Muscipular 于 2023-5-15 12:40 编辑 ]

TOP

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

TOP

发新话题