Board logo

标题: [魔力私服分享] 关于服务端内存优化的一些经验 [打印本页]

作者: 易凡    时间: 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; Ydata下的其它文档也是一样的道理。用编号,不要太任性。魔力私服,最新魔力宝贝私服技术交流/ 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=nil5 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