Board logo

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

作者: 易凡    时间: 2023-5-15 01:16     标题: 关于服务端内存优化的一些经验

大家也知道,妖城魔力一个区开服了十周年多了妖城在线论坛% s6 k  g8 k$ i

( _! X1 J  K" D! ~; H. w# pbbs.mocwww.com不管是数据库还是data的冗余肯定都非常多。
& W  u  y) Z! X# N. N魔力私服,最新魔力宝贝私服技术交流
9 s) d& X: j2 Z$ s/ _对于妖城这样的数据量大的服务器,首先数据库肯定不能放在跟服务端运行的同一个服务器里。魔力私服,最新魔力宝贝私服技术交流' I! d! @, o, y9 @7 A" \$ p

: V8 t" m* n/ c) a% T魔力私服,最新魔力宝贝私服技术交流这是基本的,所以,最好是运行服务端的服务器一台,数据库单独一台。bbs.mocwww.com& i( `4 {7 u0 h& I

3 {- l8 i: v' X% A; F3 t0 @9 T& N3 A  h  c—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート因为数据库大了之后,mysql的资源占用也是很可观的。能省则省。
0 u9 u, X/ ?3 \, h* K9 J魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表bbs.mocwww.com, O) Q; D+ l" c4 a' V+ {9 d) ]
然后关于在有限资源的前提下(魔力原生的服务端是只能运行32位系统的,也就是最大4g内存,后续可能有别的引擎升级兼容了64位那另说)魔力私服,最新魔力宝贝私服技术交流6 }$ P) C# Z2 A) ^0 x

  ^( h" Y5 U, s# ?4 B' ?$ j# h, ibbs.mocwww.com优化有两个方面
2 z2 z( t, }8 g( v妖城在线论坛一:data方面
1 ^* s9 S- R. ?% C+ C! u0 Rdata下几乎所有的txt设定,比如npc/msg/itemset/enemy等等6 C7 D7 N4 a5 H1 q* q, L
记住编号不要随意乱设置,尽量往小的,没用到的设定
- @9 |. e! O5 ]2 k9 W' y4 w—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート比如你不要把一个msg的编号设定成390000000,三亿多了
) P0 ^/ s! R# G" x% v5 A魔力私服,最新魔力宝贝私服技术交流因为在程序的逻辑里,我不可能为了寻找到某个编号,就每次去整个msg里面从上到下循环搜索吧?魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表) R  I2 W/ L+ P! y8 c+ h+ g6 N
所以程序逻辑,会在服务端启动的时候,就根据你msg的最大编号为上限,设定一个跳转表。
0 f0 e4 O4 R7 ^9 |; l—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート对程序员来说,讲到这里应该就懂了
$ n4 W6 G+ D1 D6 E, U5 M( k3 @魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表但是对于非程序员来说,我多说两句,跳转表是为了快速定位数据不需要从上到下循环搜索的。
) c$ J6 r0 E; |4 T0 S! m6 U6 |你可以理解跳转表是连续的一堆信息。
9 J- s2 o1 @' I' g% q8 {—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート你的msg编号最大的如果是100000,那么程序启动的时候就会设定10万个连续的数据空间用来存放对应每个msg编号指向msg.txt的哪一行。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表2 N% p5 w; \/ F9 s5 N" i! H
这样,当游戏里,需要调用到某个msg的时候(比如道具说明啊,npc对话啊,boss发言啊之类的)bbs.mocwww.com( \4 u1 G, b& s0 Q* M6 f
它直接通过编号获取跳转表指向的msg行,获取到msg的内容。
" w0 k; `  i1 d+ D( p—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート这就导致了一个问题,你要是把msg的最大编号设置成3亿多。。。。可想而知浪费了多少内存?9 |' ?; B9 J6 Y* {

1 ^$ Z0 O% e) |' d, D魔力私服,最新魔力宝贝私服技术交流data下的其它文档也是一样的道理。用编号,不要太任性。bbs.mocwww.com+ `0 u; Q" \' O1 B; A6 W* M
魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表7 V% }( C* p  |7 t2 N$ o  S
二:lua方面—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート4 c7 M# Y# [# N& c4 n) m
lua方面最大的内存占用,应该就是table类型的反复释放和创建了。
* d/ Z% x/ e: P3 D—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート因为没有深入阅读lua的代码魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表+ i3 c& B1 o6 a6 {, D: g
所以对于lua的内存管理一直是很懵的。
6 f& m1 w# _9 X2 Y6 m魔力私服,最新魔力宝贝私服技术交流如果没有对内存占用比较敏感的话
# e9 C9 G+ T3 z. K$ _/ n- T. c0 J妖城在线论坛正常运行的服务器,一般都会给每个玩家登陆的时候,或者玩家某个行为的时候,创建一个临时的tabble—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート& Z% D9 N, N  H
这个table的生命周期仅限于这玩家本次登录的时候。
' Y; O: C' M" ~% V" m) d9 Z妖城在线论坛然后玩家下线了,就释放掉,比如tablexx=nil, N: ^9 |: V0 y8 B
但是这样做有一个问题。。。
9 F8 ^/ i, L. ~7 e& k魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表你可以尝试一个玩家登陆的时候,你创建一个百万级别的table项目。bbs.mocwww.com3 ^  B$ v6 i- z9 g' \
玩家下线的时候,你nil掉这个table
0 e5 c  R* w8 P! E5 A7 e# B—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート并且你也可以及时得使用lua的垃圾回收释放无效的内存。
* G7 d2 [0 M& U& u. X: F, s但问题是,你垃圾回收后,你读取lua的占用内存,发现确实下降了魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表& \1 ?- R4 M: ^+ s1 r
但是在linux下用系统命令top查看。。。。。
6 D$ ~. x$ j/ R% F1 s& J: ~—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート魔力服务端所占用的内存毫无下降。
: }. p2 o" Z# g( T% ~5 s妖城在线论坛那么你再次登陆角色,又创建了一批内存
2 y" F6 n* f  h$ o7 i—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート我至今依然没有通读lua引擎的代码,所以依然不能确定lua的内存管理方式。
9 N3 q' C% L) B: B/ p$ r- y—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート但是根据这段时间的测试
) G4 u/ M! \. l8 L魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表可以总结经验(并不一定对):lua会霸占整个系统的内存,并以你目前最大用到的多少为限,你用lua的垃圾回收功能,是回收了魔力私服,最新魔力宝贝私服技术交流0 J% |" S, S1 A% T; m; {2 Z
但是这部分内存并不归还给linux系统—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート- r+ \9 S  F) E; T$ h# a: p1 g
lua会认为,你既然现在能用到这个尺度的内存,那我留着,你等下迟早也要用到。。。。。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート" n5 P, @6 I: D! p3 Q
这就导致了,不停的table的nil释放并不能真正释放整个魔力服务端运行时占用的内存
3 P6 y* X+ v! i4 H' @, [2 A6 E! q魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表这个跟正常的编程意识就有点不符合了。。。。。。bbs.mocwww.com/ ]% `, S; y$ Z+ H$ w4 ^
但反正它大概是这么操作的。妖城在线论坛& W& C( w8 p' z" ?2 ^3 H  ?
解决方案是什么呢?bbs.mocwww.com7 ?# a1 w  G% w5 O
不要用cdkey啥的做table的key(如果非要不可,我感觉宁愿弄成field存到数据库中)
# k/ L: i. ~: G$ y* k; c3 x魔力私服,最新魔力宝贝私服技术交流启动的时候,根据当前设定的最大在线人数,预先扩充一个table
5 b$ g  i  G: r. V  \: v魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表这个table的索引key使用CharIndex这个序号
9 }7 Q: S& ~0 ]. ^4 [" p—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート玩家下线的时候,不要nil掉,只要再次初始化数据就好了。魔力私服,最新魔力宝贝私服技术交流& l: U% L7 P0 t4 ^/ r$ \- [
这样就不会反复创建了
4 `( w+ B: o- D1 t魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表bbs.mocwww.com: P- }+ M8 \- v, M- @+ g8 @
三:引擎,c语言方面bbs.mocwww.com, u3 s% k% ]2 w: Y' q' W$ d1 {' ~
也是同样的观点。
/ A( `( t  I& z7 N4 b$ p2 j/ Q—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート尽量预设开辟一段既定的内存空间,不要试图去在登陆和登出的时候频繁的创建和释放
$ s$ A8 L% \9 r: S. D  W/ f1 K—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表6 B; U+ Q. `, E" _' v6 }) r: t1 h
最初妖城启动占用内存大概2.3g,运行大概十天半个月后,就会出现内存溢出,轻则挂端重则回档。- ~2 N$ v5 s7 n; d( H
后来优化后(其实没有优化到极致)启动占用内存800m左右,干净的系统top下观察占用内存1g而已
( J3 j1 U' A# O/ s2 S  G连续运行几个月都不会有问题。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート2 ~) k$ i# p' d# J2 {& p0 a
—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート* u! j8 p3 i" B# q: g) Y& W9 A
以上说的三个方面—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート0 o* k* U1 A' D2 M
两个都是一般的开服的gm自己可以控制优化的,第三个是必须引擎技术商方面优化的。妖城在线论坛1 R$ j# t. T  S

, p( b8 r  |1 e* Mbbs.mocwww.com大家可以试一下
作者: Muscipular    时间: 2023-5-15 12:32

补充几点bbs.mocwww.com# a$ z4 W5 b: V. W) w+ K
1. 关于可用内存,实际上linux上面只有3g,windows下面只有2g魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表. `( S& P7 `: x# ?+ y# ~
2. luajit 可用内存是2g,除非 64位+GC64模式bbs.mocwww.com' Q, j8 ~  d* `$ x4 A/ k
2.1. 内存回收,lua 申请的内存看luajit的实现了,默认跟c一样的处理逻辑,但如果是myalloc的话,大概率会有内存泄漏,不过就算是c的内存申请后也不是马上归回系统的。
. E2 \3 `! L" v# E/ W1 _0 |  |bbs.mocwww.com3. gmsv里面动态申请的数据主要是迷宫,不过引擎的myalloc,大概率会有内存泄漏bbs.mocwww.com; c: w4 Q. J. O: @7 D( u; G2 m# j' [
/ F* I' i6 k$ D. H6 d( D' h
[ 本帖最后由 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