发新话题
打印

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

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

大家也知道,妖城魔力一个区开服了十周年多了6 e) o" e3 Y1 Z9 R+ r. n" _

& X; a9 P+ z, J( z不管是数据库还是data的冗余肯定都非常多。bbs.mocwww.com+ T, ]: F3 o: s3 q4 P7 A

4 Q+ e; D  `0 A; Z, w8 D. A魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表对于妖城这样的数据量大的服务器,首先数据库肯定不能放在跟服务端运行的同一个服务器里。- ]7 G/ m! O( Z# T
bbs.mocwww.com5 x6 e8 b- U& M- [, e$ d
这是基本的,所以,最好是运行服务端的服务器一台,数据库单独一台。$ N3 m* I7 ]. i, R% {8 a5 l
魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表" ^& ^; w* [' E
因为数据库大了之后,mysql的资源占用也是很可观的。能省则省。
8 `9 c/ ]$ f  p9 N& _* ?7 T$ B; z魔力私服,最新魔力宝贝私服技术交流
8 ~# c' @7 Q' t4 c2 F; }. Rbbs.mocwww.com然后关于在有限资源的前提下(魔力原生的服务端是只能运行32位系统的,也就是最大4g内存,后续可能有别的引擎升级兼容了64位那另说)
$ |+ E" G, h8 t/ G: w% E) [& N—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート
. Z6 W, V8 g; U& a魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表优化有两个方面' P% J: l% j/ V7 U  I2 V
一:data方面魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表" j9 F+ x0 ?4 A' M
data下几乎所有的txt设定,比如npc/msg/itemset/enemy等等
& f4 F; k2 |! E& d9 n7 o* ^: O记住编号不要随意乱设置,尽量往小的,没用到的设定
/ v) Y( R2 g9 u, h) L* x—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート比如你不要把一个msg的编号设定成390000000,三亿多了
; _1 c0 K/ t. ]1 D魔力私服,最新魔力宝贝私服技术交流因为在程序的逻辑里,我不可能为了寻找到某个编号,就每次去整个msg里面从上到下循环搜索吧?魔力私服,最新魔力宝贝私服技术交流+ b! K- |! C7 D5 C  m
所以程序逻辑,会在服务端启动的时候,就根据你msg的最大编号为上限,设定一个跳转表。妖城在线论坛' T3 x5 j/ x$ D  f, [
对程序员来说,讲到这里应该就懂了
& @. [& ~9 b6 R4 [* N+ h6 h妖城在线论坛但是对于非程序员来说,我多说两句,跳转表是为了快速定位数据不需要从上到下循环搜索的。
9 I7 k% }" x2 O: }6 r你可以理解跳转表是连续的一堆信息。
) A2 L0 y. t. A$ g( n3 ]2 H妖城在线论坛你的msg编号最大的如果是100000,那么程序启动的时候就会设定10万个连续的数据空间用来存放对应每个msg编号指向msg.txt的哪一行。
$ ^' G) ~  p* M7 \6 i* @魔力私服,最新魔力宝贝私服技术交流这样,当游戏里,需要调用到某个msg的时候(比如道具说明啊,npc对话啊,boss发言啊之类的)
4 {2 N0 K- H( c  V; b  ~魔力私服,最新魔力宝贝私服技术交流它直接通过编号获取跳转表指向的msg行,获取到msg的内容。
0 V  R/ \: n2 D; m: G/ {bbs.mocwww.com这就导致了一个问题,你要是把msg的最大编号设置成3亿多。。。。可想而知浪费了多少内存?妖城在线论坛. \8 q& G; p$ @  T: k" I& N
. c: O; ~  O- ^5 z! Q8 @; L
data下的其它文档也是一样的道理。用编号,不要太任性。魔力私服,最新魔力宝贝私服技术交流" M; i  e2 w2 h+ w

) {" n% g: o$ E6 y7 `! {0 g7 ?# j妖城在线论坛二:lua方面
+ S- e% i' q% x8 E1 ^bbs.mocwww.comlua方面最大的内存占用,应该就是table类型的反复释放和创建了。
. s, P/ X6 C  H- W% Y魔力私服,最新魔力宝贝私服技术交流因为没有深入阅读lua的代码魔力私服,最新魔力宝贝私服技术交流/ i8 v, v: U5 A8 {
所以对于lua的内存管理一直是很懵的。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表, x; q2 ^8 \* T  Z7 Y3 v" L
如果没有对内存占用比较敏感的话
+ _  k( [/ J& G魔力私服,最新魔力宝贝私服技术交流正常运行的服务器,一般都会给每个玩家登陆的时候,或者玩家某个行为的时候,创建一个临时的tabble—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート8 v1 `8 L* L0 T0 S
这个table的生命周期仅限于这玩家本次登录的时候。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート8 o0 p$ ~1 m" R. e/ a1 Z3 P
然后玩家下线了,就释放掉,比如tablexx=nil
, ]1 |' A+ l1 T8 t( qbbs.mocwww.com但是这样做有一个问题。。。妖城在线论坛" k* q* j( @) t. m. A0 R
你可以尝试一个玩家登陆的时候,你创建一个百万级别的table项目。
) X- k1 P# |. q; k1 M魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表玩家下线的时候,你nil掉这个table魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表* y' q* j$ p* q5 n7 e
并且你也可以及时得使用lua的垃圾回收释放无效的内存。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート$ m. ]3 c2 ?  A+ f5 G1 L( r) g
但问题是,你垃圾回收后,你读取lua的占用内存,发现确实下降了
9 s4 K  y5 D2 v$ L妖城在线论坛但是在linux下用系统命令top查看。。。。。
+ S" N; m) z4 P  W) u& g+ l魔力私服,最新魔力宝贝私服技术交流魔力服务端所占用的内存毫无下降。
! u2 O7 o! i$ A+ t  }魔力私服,最新魔力宝贝私服技术交流那么你再次登陆角色,又创建了一批内存
1 J! q7 G  k7 A! {  t妖城在线论坛我至今依然没有通读lua引擎的代码,所以依然不能确定lua的内存管理方式。
. V! p  l& V* z' d! K6 W妖城在线论坛但是根据这段时间的测试bbs.mocwww.com0 j0 X& r: [0 r5 }) [( D
可以总结经验(并不一定对):lua会霸占整个系统的内存,并以你目前最大用到的多少为限,你用lua的垃圾回收功能,是回收了
4 a. F& ]5 l4 W, c- o9 \/ C—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート但是这部分内存并不归还给linux系统
  J2 s: @' n3 J* _bbs.mocwww.comlua会认为,你既然现在能用到这个尺度的内存,那我留着,你等下迟早也要用到。。。。。
& s$ E  z1 z+ Tbbs.mocwww.com这就导致了,不停的table的nil释放并不能真正释放整个魔力服务端运行时占用的内存魔力私服,最新魔力宝贝私服技术交流. ?3 A1 K$ X5 U! j/ [
这个跟正常的编程意识就有点不符合了。。。。。。妖城在线论坛' \9 E6 j$ E2 ^2 Q
但反正它大概是这么操作的。
4 q. n8 O# ^+ F9 \- y' l" e—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート解决方案是什么呢?魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表- J$ ~* |2 A% z% p* g) [( U
不要用cdkey啥的做table的key(如果非要不可,我感觉宁愿弄成field存到数据库中)魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表( q, R# Q% t5 p+ R5 _
启动的时候,根据当前设定的最大在线人数,预先扩充一个table
6 \0 C# ^& H5 _这个table的索引key使用CharIndex这个序号; e4 \1 S6 g# `. E" u
玩家下线的时候,不要nil掉,只要再次初始化数据就好了。
1 m: ?7 {( J$ x+ ~" E) T7 |魔力私服,最新魔力宝贝私服技术交流这样就不会反复创建了魔力私服,最新魔力宝贝私服技术交流! w; @, _7 D/ u  J3 k, H# l
魔力私服,最新魔力宝贝私服技术交流+ k9 }% A1 l2 H. S" s
三:引擎,c语言方面. R3 q3 A  R" f: @1 k+ @2 E$ t
也是同样的观点。
* D/ d. z' }# s4 _# `2 L7 ~" L—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート尽量预设开辟一段既定的内存空间,不要试图去在登陆和登出的时候频繁的创建和释放魔力私服,最新魔力宝贝私服技术交流' I5 }* z3 l7 `' K2 L" X* h% A5 e

4 G) d" \. M$ l) ^& U魔力私服,最新魔力宝贝私服技术交流最初妖城启动占用内存大概2.3g,运行大概十天半个月后,就会出现内存溢出,轻则挂端重则回档。
- N$ Z1 [5 L: l7 Qbbs.mocwww.com后来优化后(其实没有优化到极致)启动占用内存800m左右,干净的系统top下观察占用内存1g而已魔力私服,最新魔力宝贝私服技术交流' C3 f% o' q- y" r8 ~4 f' y$ [5 x
连续运行几个月都不会有问题。
7 J8 {+ G. K4 A$ Q1 t( {' O魔力私服,最新魔力宝贝私服技术交流
" s. E3 m6 ]( K3 ~) e1 u; R# I魔力私服,最新魔力宝贝私服技术交流以上说的三个方面
$ [# c( @3 z5 I  H/ Y# n两个都是一般的开服的gm自己可以控制优化的,第三个是必须引擎技术商方面优化的。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表& H% |, K% O/ X! M5 \2 `

5 S* z' _% n7 C, r& N. P, G妖城在线论坛大家可以试一下
妖城欢迎您!

TOP

补充几点0 s8 g& U" B" b3 _- f: K  F9 ]
1. 关于可用内存,实际上linux上面只有3g,windows下面只有2gbbs.mocwww.com( o0 f) I" o. n" h- s* x. f: c! Q7 T
2. luajit 可用内存是2g,除非 64位+GC64模式
- v$ i. \+ Y4 o- xbbs.mocwww.com2.1. 内存回收,lua 申请的内存看luajit的实现了,默认跟c一样的处理逻辑,但如果是myalloc的话,大概率会有内存泄漏,不过就算是c的内存申请后也不是马上归回系统的。
2 v- T( E* Z8 {9 V! h9 n魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表3. gmsv里面动态申请的数据主要是迷宫,不过引擎的myalloc,大概率会有内存泄漏
+ y# `. O8 Q7 A: ?* n3 ]" V魔力私服,最新魔力宝贝私服技术交流
, H3 k. g6 l& f3 e! ]妖城在线论坛[ 本帖最后由 Muscipular 于 2023-5-15 12:40 编辑 ]

TOP

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

TOP

发新话题