发新话题
打印

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

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

大家也知道,妖城魔力一个区开服了十周年多了
7 @# K- o+ G# H4 ~# {' M" Y% e. |bbs.mocwww.com
! \4 ^: g" Q- h不管是数据库还是data的冗余肯定都非常多。2 J. g/ ]4 K. q6 P7 R
魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表$ i) }1 g) }4 Y& m' S5 H, }
对于妖城这样的数据量大的服务器,首先数据库肯定不能放在跟服务端运行的同一个服务器里。
! k* ^& \/ E3 I% P0 Bbbs.mocwww.com) C$ v3 n) h& P9 M, d2 Y* z7 N0 B
这是基本的,所以,最好是运行服务端的服务器一台,数据库单独一台。妖城在线论坛- J& b. x2 z" o, L6 |8 z

! i2 ?2 R1 M2 c9 B因为数据库大了之后,mysql的资源占用也是很可观的。能省则省。
5 G) M: |- H$ t& e: P+ U3 }—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート7 D* I! Z% o; Z* j9 C
然后关于在有限资源的前提下(魔力原生的服务端是只能运行32位系统的,也就是最大4g内存,后续可能有别的引擎升级兼容了64位那另说)
# w2 W: _3 m) {; x- |魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表0 B( H' Q1 d+ M7 f
优化有两个方面
9 W9 k$ p' Q" b- }+ y3 L魔力私服,最新魔力宝贝私服技术交流一:data方面
, G+ x5 V% Y2 f5 Bbbs.mocwww.comdata下几乎所有的txt设定,比如npc/msg/itemset/enemy等等
+ c; l1 C% M- a& }# c6 _! c魔力私服,最新魔力宝贝私服技术交流记住编号不要随意乱设置,尽量往小的,没用到的设定
& E, B- ]* F9 o, i. j* L; e比如你不要把一个msg的编号设定成390000000,三亿多了魔力私服,最新魔力宝贝私服技术交流! d: U% }; c1 q% c- m  r) E
因为在程序的逻辑里,我不可能为了寻找到某个编号,就每次去整个msg里面从上到下循环搜索吧?魔力私服,最新魔力宝贝私服技术交流. I) `7 R0 G% r3 C$ G
所以程序逻辑,会在服务端启动的时候,就根据你msg的最大编号为上限,设定一个跳转表。
" R4 o$ u/ K/ v魔力私服,最新魔力宝贝私服技术交流对程序员来说,讲到这里应该就懂了
" j) a9 x9 q$ f! b% o% N7 y1 A魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表但是对于非程序员来说,我多说两句,跳转表是为了快速定位数据不需要从上到下循环搜索的。
& E! ^: V0 y, M+ @魔力私服,最新魔力宝贝私服技术交流你可以理解跳转表是连续的一堆信息。
6 D( e& V; p3 [+ z. p魔力私服,最新魔力宝贝私服技术交流你的msg编号最大的如果是100000,那么程序启动的时候就会设定10万个连续的数据空间用来存放对应每个msg编号指向msg.txt的哪一行。' N9 P, H$ l+ g8 ]3 I0 g7 c
这样,当游戏里,需要调用到某个msg的时候(比如道具说明啊,npc对话啊,boss发言啊之类的)
+ A2 P! a) ~4 B2 {6 n: d妖城在线论坛它直接通过编号获取跳转表指向的msg行,获取到msg的内容。妖城在线论坛# u. E4 n6 n( y- @0 s* K
这就导致了一个问题,你要是把msg的最大编号设置成3亿多。。。。可想而知浪费了多少内存?
$ f4 }; O% F; B妖城在线论坛6 K( R: A, F2 q: b* V
data下的其它文档也是一样的道理。用编号,不要太任性。妖城在线论坛& O5 Z9 Y5 [$ @+ e# ]

, e  C: n" g7 T  A5 y0 L) V) e7 q- L' S魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表二:lua方面. l* X- q/ t4 |* W: l" j1 n
lua方面最大的内存占用,应该就是table类型的反复释放和创建了。
* r0 |, ]; {# X2 u1 z魔力私服,最新魔力宝贝私服技术交流因为没有深入阅读lua的代码魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表( I' j, `  Y1 Q2 _  V
所以对于lua的内存管理一直是很懵的。
7 ^! K9 q- @* C/ k! a' ~. w如果没有对内存占用比较敏感的话
- L  c8 @* N7 ~" S  o魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表正常运行的服务器,一般都会给每个玩家登陆的时候,或者玩家某个行为的时候,创建一个临时的tabble魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表# q6 G  E8 q  V3 x- w
这个table的生命周期仅限于这玩家本次登录的时候。魔力私服,最新魔力宝贝私服技术交流" a9 Y5 V" w! m' |! _2 H
然后玩家下线了,就释放掉,比如tablexx=nil妖城在线论坛6 k0 P! o5 P8 @
但是这样做有一个问题。。。
8 |3 L( z8 D3 U- ~( }. {—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート你可以尝试一个玩家登陆的时候,你创建一个百万级别的table项目。
: H$ U) E( L7 e* k3 K- o0 T魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表玩家下线的时候,你nil掉这个table
. ^& I/ Z2 Q/ [5 d$ L7 ^' a% b) Z% h妖城在线论坛并且你也可以及时得使用lua的垃圾回收释放无效的内存。4 x4 y4 @' C- u1 m
但问题是,你垃圾回收后,你读取lua的占用内存,发现确实下降了妖城在线论坛5 w% v* ?9 U% ]# \7 {/ ^
但是在linux下用系统命令top查看。。。。。
# y6 K& d& D* p0 |2 M魔力私服,最新魔力宝贝私服技术交流魔力服务端所占用的内存毫无下降。
9 J7 g, q- X' `, T魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表那么你再次登陆角色,又创建了一批内存妖城在线论坛# o7 i; r- J! ?, L" A
我至今依然没有通读lua引擎的代码,所以依然不能确定lua的内存管理方式。妖城在线论坛# ~4 v& i9 r1 d: t0 u* ~
但是根据这段时间的测试魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表5 u$ J) f0 B, z5 Q( P8 g
可以总结经验(并不一定对):lua会霸占整个系统的内存,并以你目前最大用到的多少为限,你用lua的垃圾回收功能,是回收了
; H4 ~* R& y3 n魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表但是这部分内存并不归还给linux系统bbs.mocwww.com( Q; W& v1 A7 V: M( b* y
lua会认为,你既然现在能用到这个尺度的内存,那我留着,你等下迟早也要用到。。。。。
7 W4 R. f' n  F- O" h5 c魔力私服,最新魔力宝贝私服技术交流这就导致了,不停的table的nil释放并不能真正释放整个魔力服务端运行时占用的内存
0 z" W, H' H% J) @3 I9 v妖城在线论坛这个跟正常的编程意识就有点不符合了。。。。。。
# V# O% q/ H+ ~% ^$ ^但反正它大概是这么操作的。bbs.mocwww.com' a  k9 s' [( C& v- t  _& S1 f# A% s
解决方案是什么呢?bbs.mocwww.com3 w0 [6 ]4 j  H7 `9 Y2 i! r
不要用cdkey啥的做table的key(如果非要不可,我感觉宁愿弄成field存到数据库中)魔力私服,最新魔力宝贝私服技术交流) [+ ?5 `1 v& U% C$ w9 K1 ~  q: i$ M
启动的时候,根据当前设定的最大在线人数,预先扩充一个table魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表; L& e: \( U. L0 C9 H
这个table的索引key使用CharIndex这个序号
- R+ E3 f( [! H$ W: ^) Q8 k魔力私服,最新魔力宝贝私服技术交流玩家下线的时候,不要nil掉,只要再次初始化数据就好了。bbs.mocwww.com/ z8 g- A9 g9 d" V) V0 V
这样就不会反复创建了
+ q6 b& t- F2 @# p0 ^魔力私服,最新魔力宝贝私服技术交流- m/ @* b) W- P
三:引擎,c语言方面
, S/ C& X( H- P4 Q! G) l也是同样的观点。妖城在线论坛# D( V, y0 o: z5 J; c/ W; ~7 w1 ^
尽量预设开辟一段既定的内存空间,不要试图去在登陆和登出的时候频繁的创建和释放魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表' q9 h( C* o/ U- T: X

. H' {6 A; W* E2 Y: Y—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート最初妖城启动占用内存大概2.3g,运行大概十天半个月后,就会出现内存溢出,轻则挂端重则回档。
0 A% n# o. K9 {0 p' V5 Q魔力私服,最新魔力宝贝私服技术交流后来优化后(其实没有优化到极致)启动占用内存800m左右,干净的系统top下观察占用内存1g而已—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート2 O6 C6 J) A/ p/ c3 ^5 [
连续运行几个月都不会有问题。魔力私服,最新魔力宝贝私服技术交流! C4 _# R. c% m& `( e1 u% Q2 z3 f* S

  m, u8 O7 J+ v: E' l" }. `—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート以上说的三个方面6 J3 n, \6 v2 s2 \
两个都是一般的开服的gm自己可以控制优化的,第三个是必须引擎技术商方面优化的。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート/ F5 u0 e& Q0 s

: }5 @4 a. e+ n) B  Z魔力私服,最新魔力宝贝私服技术交流大家可以试一下
妖城欢迎您!

TOP

补充几点
) N( d+ P, E1 a: H# P—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート1. 关于可用内存,实际上linux上面只有3g,windows下面只有2g
  C/ s* @0 z! h$ T& n& e2. luajit 可用内存是2g,除非 64位+GC64模式
6 p8 q: K- e1 r% ^* J" I3 k+ bbbs.mocwww.com2.1. 内存回收,lua 申请的内存看luajit的实现了,默认跟c一样的处理逻辑,但如果是myalloc的话,大概率会有内存泄漏,不过就算是c的内存申请后也不是马上归回系统的。
0 E7 R- }  L; \6 x4 @1 V3. gmsv里面动态申请的数据主要是迷宫,不过引擎的myalloc,大概率会有内存泄漏
0 W7 \3 x, N! b# e
9 S1 ]) T/ B. k9 O5 u5 h[ 本帖最后由 Muscipular 于 2023-5-15 12:40 编辑 ]

TOP

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

TOP

发新话题