标题:
[魔力私服分享]
关于服务端内存优化的一些经验
[打印本页]
作者:
易凡
时间:
2023-5-15 01:16
标题:
关于服务端内存优化的一些经验
大家也知道,妖城魔力一个区开服了十周年多了
. K7 w! p$ Z1 R& ^0 J' ^# {9 P: ^
1 S" D3 h/ i# w/ N) D& j
不管是数据库还是data的冗余肯定都非常多。
) x- @% b7 e% Q1 D/ g! \—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート
# i7 K* a( W6 I; R$ t p Y6 X/ ~—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート
对于妖城这样的数据量大的服务器,首先数据库肯定不能放在跟服务端运行的同一个服务器里。
bbs.mocwww.com% ~) P" ^" m- V5 A- w. u" J
0 z& F5 G* v% c/ ?0 h# l. b
这是基本的,所以,最好是运行服务端的服务器一台,数据库单独一台。
—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート. I$ Z, _5 K( D& W, M
]2 w5 A( i. [; ]0 e" H魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表
因为数据库大了之后,mysql的资源占用也是很可观的。能省则省。
+ q" M/ x3 B, ], F6 j# m妖城在线论坛
! q1 d4 h" i5 l1 d- O( r
然后关于在有限资源的前提下(魔力原生的服务端是只能运行32位系统的,也就是最大4g内存,后续可能有别的引擎升级兼容了64位那另说)
8 n- {& J- V2 `4 s |4 J—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート
B# ~& S2 k6 n: _ [- \bbs.mocwww.com
优化有两个方面
妖城在线论坛, l! B& }5 o6 g* `5 Z8 h
一:data方面
bbs.mocwww.com c \/ ?. m p5 A- q
data下几乎所有的txt设定,比如npc/msg/itemset/enemy等等
8 c! {% b: f$ ]4 v% b" G9 W) ?: nbbs.mocwww.com
记住编号不要随意乱设置,尽量往小的,没用到的设定
bbs.mocwww.com8 O2 D; [9 Z6 _& F/ q1 A7 o% J
比如你不要把一个msg的编号设定成390000000,三亿多了
6 t$ U6 n, }2 m3 S' }—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート
因为在程序的逻辑里,我不可能为了寻找到某个编号,就每次去整个msg里面从上到下循环搜索吧?
- w1 U: B X$ n2 A6 [/ qbbs.mocwww.com
所以程序逻辑,会在服务端启动的时候,就根据你msg的最大编号为上限,设定一个跳转表。
魔力私服,最新魔力宝贝私服技术交流; ?, }% p U5 f, X
对程序员来说,讲到这里应该就懂了
! Z" u. M3 U5 I, y3 d& D魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表
但是对于非程序员来说,我多说两句,跳转表是为了快速定位数据不需要从上到下循环搜索的。
魔力私服,最新魔力宝贝私服技术交流3 p' A+ a5 J5 Q, _7 k! m! g
你可以理解跳转表是连续的一堆信息。
魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表0 v5 ]) v( F# v# O
你的msg编号最大的如果是100000,那么程序启动的时候就会设定10万个连续的数据空间用来存放对应每个msg编号指向msg.txt的哪一行。
妖城在线论坛" A& \# @8 \5 w/ M# g4 w1 v2 W
这样,当游戏里,需要调用到某个msg的时候(比如道具说明啊,npc对话啊,boss发言啊之类的)
: j9 W5 m4 z- S4 Q魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表
它直接通过编号获取跳转表指向的msg行,获取到msg的内容。
2 S: F" o# Z5 E, q; d: dbbs.mocwww.com
这就导致了一个问题,你要是把msg的最大编号设置成3亿多。。。。可想而知浪费了多少内存?
6 f! S0 q& [1 P5 u6 D: z+ \; Gbbs.mocwww.com
$ g$ X% {, q- E) [4 Y# L; Y
data下的其它文档也是一样的道理。用编号,不要太任性。
魔力私服,最新魔力宝贝私服技术交流/ S8 j1 D' W! p0 h. j
—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート* W! D& L* @ [4 B
二:lua方面
$ b2 X; O+ ?2 Y1 @—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート
lua方面最大的内存占用,应该就是table类型的反复释放和创建了。
- j* z ]% F- V8 l# bbbs.mocwww.com
因为没有深入阅读lua的代码
魔力私服,最新魔力宝贝私服技术交流9 H; @6 |& p( E, X* ^0 G
所以对于lua的内存管理一直是很懵的。
, @+ Y" G# N0 a3 a5 x, L+ s) o9 X—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート
如果没有对内存占用比较敏感的话
0 v. S) R- \, O$ l" S2 b* h
正常运行的服务器,一般都会给每个玩家登陆的时候,或者玩家某个行为的时候,创建一个临时的tabble
H5 S5 e: D. @( x( C) }( i魔力私服,最新魔力宝贝私服技术交流
这个table的生命周期仅限于这玩家本次登录的时候。
& O' z' @' p- ?; x% a& d3 x3 {
然后玩家下线了,就释放掉,比如tablexx=nil
5 j6 n" b- Y0 Q8 p1 v8 Z8 @5 T
但是这样做有一个问题。。。
魔力私服,最新魔力宝贝私服技术交流! O7 r2 W8 O/ o/ S) R8 M, e' x
你可以尝试一个玩家登陆的时候,你创建一个百万级别的table项目。
魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表. M; ?0 Q' r2 }5 }
玩家下线的时候,你nil掉这个table
) W! L. n$ }3 g" }1 K8 [( W/ O
并且你也可以及时得使用lua的垃圾回收释放无效的内存。
% ^! b% \: k' R C' O
但问题是,你垃圾回收后,你读取lua的占用内存,发现确实下降了
魔力私服,最新魔力宝贝私服技术交流$ b$ L7 A& X0 ]6 ^
但是在linux下用系统命令top查看。。。。。
魔力私服,最新魔力宝贝私服技术交流4 {) ]6 s- B# V6 w. {8 E
魔力服务端所占用的内存毫无下降。
# f7 `3 t# ~8 k) ]' ]0 W0 ]魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表
那么你再次登陆角色,又创建了一批内存
魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表. J) ?" l* |( y t# I
我至今依然没有通读lua引擎的代码,所以依然不能确定lua的内存管理方式。
1 _3 Q$ d. w1 o1 o* J魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表
但是根据这段时间的测试
: t9 ~# v& p! F7 N
可以总结经验(并不一定对):lua会霸占整个系统的内存,并以你目前最大用到的多少为限,你用lua的垃圾回收功能,是回收了
. T9 t2 t0 v' [3 g. S1 \
但是这部分内存并不归还给linux系统
—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート, t" o* |& H1 [: S1 e
lua会认为,你既然现在能用到这个尺度的内存,那我留着,你等下迟早也要用到。。。。。
魔力私服,最新魔力宝贝私服技术交流& \. D; Z1 a2 T- h. M/ K# i
这就导致了,不停的table的nil释放并不能真正释放整个魔力服务端运行时占用的内存
bbs.mocwww.com" M) ~# J$ w: u# m) i. h
这个跟正常的编程意识就有点不符合了。。。。。。
1 X% ?% y) {# U) e魔力私服,最新魔力宝贝私服技术交流
但反正它大概是这么操作的。
" F* ~" Y( G& [+ M% e4 ^bbs.mocwww.com
解决方案是什么呢?
% @4 e4 x/ v; n' C/ ^$ ~魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表
不要用cdkey啥的做table的key(如果非要不可,我感觉宁愿弄成field存到数据库中)
4 Z7 |, I! c% o/ ?' U/ Z魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表
启动的时候,根据当前设定的最大在线人数,预先扩充一个table
5 @; `! }4 V" Q$ \: P$ \魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表
这个table的索引key使用CharIndex这个序号
! i8 U) p' x' R4 ~% r魔力私服,最新魔力宝贝私服技术交流
玩家下线的时候,不要nil掉,只要再次初始化数据就好了。
魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表6 _+ }, V2 N" v9 ]
这样就不会反复创建了
, K d4 e+ {0 x/ ~魔力私服,最新魔力宝贝私服技术交流
4 j) {$ Y0 B8 ~, \' J w魔力私服,最新魔力宝贝私服技术交流
三:引擎,c语言方面
9 Q: E$ U. ?! P1 @( O x9 l& G) G魔力私服,最新魔力宝贝私服技术交流
也是同样的观点。
魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表* h7 X4 L3 G5 S6 b, G4 \
尽量预设开辟一段既定的内存空间,不要试图去在登陆和登出的时候频繁的创建和释放
" ^7 K( K) }( W, ^9 A妖城在线论坛
魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表1 A+ E8 ~% z* I/ W9 r3 U
最初妖城启动占用内存大概2.3g,运行大概十天半个月后,就会出现内存溢出,轻则挂端重则回档。
0 r3 B% F7 d: W8 t& e: ^$ s; c妖城在线论坛
后来优化后(其实没有优化到极致)启动占用内存800m左右,干净的系统top下观察占用内存1g而已
+ @" H( ], D: E3 l. \( z
连续运行几个月都不会有问题。
* r3 g( p% H' q% i魔力私服,最新魔力宝贝私服技术交流
9 q4 b+ t a0 _# h' S) U% p4 K
以上说的三个方面
j& O. t% i, f+ ~bbs.mocwww.com
两个都是一般的开服的gm自己可以控制优化的,第三个是必须引擎技术商方面优化的。
2 F# \0 A: {/ d& @3 y! Z7 R. Z1 |妖城在线论坛
! p4 F# v; i0 a/ K$ ?—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート
大家可以试一下
作者:
Muscipular
时间:
2023-5-15 12:32
补充几点
bbs.mocwww.com. o. E" L8 l7 r% K, v) K
1. 关于可用内存,实际上linux上面只有3g,windows下面只有2g
4 `; o7 w2 L; l \魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表
2. luajit 可用内存是2g,除非 64位+GC64模式
1 z% `5 u/ T! I' p3 _
2.1. 内存回收,lua 申请的内存看luajit的实现了,默认跟c一样的处理逻辑,但如果是myalloc的话,大概率会有内存泄漏,不过就算是c的内存申请后也不是马上归回系统的。
1 u+ g& ]. _5 k! r2 j3 k$ g) e魔力私服,最新魔力宝贝私服技术交流
3. gmsv里面动态申请的数据主要是迷宫,不过引擎的myalloc,大概率会有内存泄漏
魔力私服,最新魔力宝贝私服技术交流' ^, {+ h8 L: k% T4 Z6 F
; o; w3 M0 ?! k8 ?" t—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート
[
本帖最后由 Muscipular 于 2023-5-15 12:40 编辑
]
作者:
易凡
时间:
2023-5-15 19:34
luajit我的是5.2.3版本的,所以我这边垃圾回收操作是不释放内存归还系统的
欢迎光临 妖城在线论坛 (http://bbs.mocwww.com/)
Powered by Discuz! 6.0.0