发新话题
打印

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

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

大家也知道,妖城魔力一个区开服了十周年多了—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート0 K. k8 _, u( e/ L, k% W  z
—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート+ _) p2 L0 Z# s0 y$ @
不管是数据库还是data的冗余肯定都非常多。
6 b, m; W# J: H8 U. N. K妖城在线论坛—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート4 d: L" a. |+ h  T% ^/ d. ]
对于妖城这样的数据量大的服务器,首先数据库肯定不能放在跟服务端运行的同一个服务器里。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表1 E" K8 }) s. |4 v5 W
—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート1 C* |& d/ C) @7 q; f) \8 d9 x& K1 c" \
这是基本的,所以,最好是运行服务端的服务器一台,数据库单独一台。bbs.mocwww.com0 c' t) c' Q1 H1 e! Z9 q  k
魔力私服,最新魔力宝贝私服技术交流/ x1 L& t5 ?" u4 ?- _2 c8 U" Z% @& D
因为数据库大了之后,mysql的资源占用也是很可观的。能省则省。魔力私服,最新魔力宝贝私服技术交流% R* t% \! C' i2 y2 q2 i

$ ?5 W5 q# r  t; t! ^bbs.mocwww.com然后关于在有限资源的前提下(魔力原生的服务端是只能运行32位系统的,也就是最大4g内存,后续可能有别的引擎升级兼容了64位那另说)
  h) H" }7 W1 `! u1 E' _& Pbbs.mocwww.com
4 g) u( k" \5 v. g" v0 {魔力私服,最新魔力宝贝私服技术交流优化有两个方面
# g7 q, N1 ^' Q- D9 W—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート一:data方面
1 S6 D) L! t+ n- g. i1 Z! Y+ r! Y3 B# k魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表data下几乎所有的txt设定,比如npc/msg/itemset/enemy等等2 l9 C  W- E8 i) N% O1 u' L
记住编号不要随意乱设置,尽量往小的,没用到的设定魔力私服,最新魔力宝贝私服技术交流. \5 V4 v7 ^. K0 z4 K* J  K1 S
比如你不要把一个msg的编号设定成390000000,三亿多了
* X, R( k- S! \8 @bbs.mocwww.com因为在程序的逻辑里,我不可能为了寻找到某个编号,就每次去整个msg里面从上到下循环搜索吧?魔力私服,最新魔力宝贝私服技术交流, i' [" a$ D  c- E  p& A
所以程序逻辑,会在服务端启动的时候,就根据你msg的最大编号为上限,设定一个跳转表。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表+ j2 O5 c( m" ~/ u; `8 F* G
对程序员来说,讲到这里应该就懂了
# n2 K  z% O- U; T! V" G# V' X魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表但是对于非程序员来说,我多说两句,跳转表是为了快速定位数据不需要从上到下循环搜索的。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート2 o9 ?+ g9 P. \' R
你可以理解跳转表是连续的一堆信息。
1 [0 r9 X0 L6 G9 D$ t魔力私服,最新魔力宝贝私服技术交流你的msg编号最大的如果是100000,那么程序启动的时候就会设定10万个连续的数据空间用来存放对应每个msg编号指向msg.txt的哪一行。
. D6 K8 c4 t- |$ L* s& D$ s- }bbs.mocwww.com这样,当游戏里,需要调用到某个msg的时候(比如道具说明啊,npc对话啊,boss发言啊之类的)
2 a" ?+ d# f2 l& `' b. hbbs.mocwww.com它直接通过编号获取跳转表指向的msg行,获取到msg的内容。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表5 j2 b& ~8 j( z( g% P
这就导致了一个问题,你要是把msg的最大编号设置成3亿多。。。。可想而知浪费了多少内存?妖城在线论坛1 g. J# _3 G. \! [

& [( f) s2 I$ V5 |" x. n魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表data下的其它文档也是一样的道理。用编号,不要太任性。
: u. H7 P# f$ q  _& W: c& j$ ~0 G0 H妖城在线论坛$ K! [( i+ t( g. ^1 B6 \: ?
二:lua方面
  D% G5 K7 O0 ?  [1 f魔力私服,最新魔力宝贝私服技术交流lua方面最大的内存占用,应该就是table类型的反复释放和创建了。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート5 R, K& |# ~9 D- p1 v) _
因为没有深入阅读lua的代码
  j& F2 {% N5 H$ ^: m% B3 Cbbs.mocwww.com所以对于lua的内存管理一直是很懵的。
$ _' j* u- b% I8 O- r) b' d3 o* T3 @% e—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート如果没有对内存占用比较敏感的话
* d$ w* l3 n  o/ R正常运行的服务器,一般都会给每个玩家登陆的时候,或者玩家某个行为的时候,创建一个临时的tabble
* a8 m9 {# J% Q魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表这个table的生命周期仅限于这玩家本次登录的时候。
  H. d) r' g4 c: m- ~魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表然后玩家下线了,就释放掉,比如tablexx=nil妖城在线论坛2 `3 T! Z# a( h  A( C
但是这样做有一个问题。。。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表1 [" g0 W, [& I" ]1 z: [- s8 W
你可以尝试一个玩家登陆的时候,你创建一个百万级别的table项目。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート, h1 D, X& P) f# d& f* P
玩家下线的时候,你nil掉这个tablebbs.mocwww.com- g; O) n( E4 r2 m6 [- r! ~
并且你也可以及时得使用lua的垃圾回收释放无效的内存。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート+ |' z) D2 x/ [/ x; y& e
但问题是,你垃圾回收后,你读取lua的占用内存,发现确实下降了
8 @3 q3 `2 ^* S; a/ N, i: d+ w3 o但是在linux下用系统命令top查看。。。。。
# F" p1 A7 x* J魔力私服,最新魔力宝贝私服技术交流魔力服务端所占用的内存毫无下降。
& @2 |, u  F, m9 v1 d魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表那么你再次登陆角色,又创建了一批内存妖城在线论坛# U8 T3 y0 z3 S  _0 T4 \, W1 D# d
我至今依然没有通读lua引擎的代码,所以依然不能确定lua的内存管理方式。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表; _! {# r6 _( o/ v& s6 Y" @
但是根据这段时间的测试妖城在线论坛  r! U2 g3 e+ i- o5 }
可以总结经验(并不一定对):lua会霸占整个系统的内存,并以你目前最大用到的多少为限,你用lua的垃圾回收功能,是回收了
5 Y) w. C" Y0 d/ i9 j; `2 M; o—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート但是这部分内存并不归还给linux系统魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表! ^9 ?8 R3 k) u0 _. t$ U) T
lua会认为,你既然现在能用到这个尺度的内存,那我留着,你等下迟早也要用到。。。。。
% q7 Y8 l" o+ ]7 @' P- |—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート这就导致了,不停的table的nil释放并不能真正释放整个魔力服务端运行时占用的内存
+ i7 X1 d2 r* H9 ~" `, ?7 [妖城在线论坛这个跟正常的编程意识就有点不符合了。。。。。。
7 K* e- J4 r. s7 G6 o8 d, J但反正它大概是这么操作的。1 C& Q/ e( G# `0 h) ~% K
解决方案是什么呢?—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート5 S+ T  E, F4 R1 ]' O: w
不要用cdkey啥的做table的key(如果非要不可,我感觉宁愿弄成field存到数据库中)魔力私服,最新魔力宝贝私服技术交流1 p, w/ @  Q  Q( s2 S
启动的时候,根据当前设定的最大在线人数,预先扩充一个table
0 M3 L9 n6 p! n% t$ F, z这个table的索引key使用CharIndex这个序号; _  g/ C. Z7 h: X0 w. L
玩家下线的时候,不要nil掉,只要再次初始化数据就好了。
( w# b2 C$ F4 ?% h) }! `bbs.mocwww.com这样就不会反复创建了
2 x3 X2 O; ]- X! U" f4 C! X" tbbs.mocwww.com
4 N' s/ R+ S4 m3 B+ Tbbs.mocwww.com三:引擎,c语言方面
$ S$ @) Z2 q5 i: ~魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表也是同样的观点。bbs.mocwww.com% E5 X0 N) d" {3 X
尽量预设开辟一段既定的内存空间,不要试图去在登陆和登出的时候频繁的创建和释放—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート: g* I$ h$ ~  h4 s9 h8 j

* H9 N0 C& J8 R- Y, Zbbs.mocwww.com最初妖城启动占用内存大概2.3g,运行大概十天半个月后,就会出现内存溢出,轻则挂端重则回档。
9 |1 @% I5 W4 _, U' |0 R+ f$ ?魔力私服,最新魔力宝贝私服技术交流后来优化后(其实没有优化到极致)启动占用内存800m左右,干净的系统top下观察占用内存1g而已
3 j" V/ l" i& r! c魔力私服,最新魔力宝贝私服技术交流连续运行几个月都不会有问题。
4 u5 Z. h1 Z4 Ubbs.mocwww.com7 h. `: p8 K  x. ~7 G& E
以上说的三个方面
* w3 b% s- }* c3 s# k% n妖城在线论坛两个都是一般的开服的gm自己可以控制优化的,第三个是必须引擎技术商方面优化的。bbs.mocwww.com1 w; g. F) M5 w' N! I# s7 x2 c
妖城在线论坛8 [* X4 c9 t2 d# T$ `
大家可以试一下
妖城欢迎您!

TOP

补充几点—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート+ X/ T* W1 ^. R/ y9 Q* ~2 H+ q
1. 关于可用内存,实际上linux上面只有3g,windows下面只有2g
" Y# _& \2 r" G0 x: H- f! ~" n—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート2. luajit 可用内存是2g,除非 64位+GC64模式% p) o* A0 f7 E" y
2.1. 内存回收,lua 申请的内存看luajit的实现了,默认跟c一样的处理逻辑,但如果是myalloc的话,大概率会有内存泄漏,不过就算是c的内存申请后也不是马上归回系统的。
7 q1 M+ P6 A' }妖城在线论坛3. gmsv里面动态申请的数据主要是迷宫,不过引擎的myalloc,大概率会有内存泄漏魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表3 u; J, c- O% i9 n1 W8 _; h2 X
妖城在线论坛/ F1 I( Y! P0 E7 D7 @4 z- i
[ 本帖最后由 Muscipular 于 2023-5-15 12:40 编辑 ]

TOP

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

TOP

发新话题