发新话题
打印

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

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

大家也知道,妖城魔力一个区开服了十周年多了妖城在线论坛# a' K4 d+ Y1 M' Q% p! W/ G5 `
魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表7 I- u1 A% w& Q0 q) e
不管是数据库还是data的冗余肯定都非常多。
0 w+ U6 v2 s& Y% f% T; a0 p6 n( O妖城在线论坛魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表% ]! R' ^. E: G7 R
对于妖城这样的数据量大的服务器,首先数据库肯定不能放在跟服务端运行的同一个服务器里。
1 v: _' _, m# G# Y6 S  I妖城在线论坛
* K+ I; y1 V- {2 z3 L—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート这是基本的,所以,最好是运行服务端的服务器一台,数据库单独一台。
! ^/ }, I) ^  u* Ybbs.mocwww.com—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート4 M4 `) ?7 q  i8 P+ |: z) d
因为数据库大了之后,mysql的资源占用也是很可观的。能省则省。
0 j+ U$ d! b: C" l3 [妖城在线论坛
; D, A0 Y) B6 p" H3 Q+ A2 b( ubbs.mocwww.com然后关于在有限资源的前提下(魔力原生的服务端是只能运行32位系统的,也就是最大4g内存,后续可能有别的引擎升级兼容了64位那另说)妖城在线论坛  ^( Y% ]% W! W$ f

- N6 `4 H+ |) V) |  B妖城在线论坛优化有两个方面
  L5 a, H$ G. k5 \) ?3 S妖城在线论坛一:data方面
/ N! {% _' J7 w* t( p+ Jdata下几乎所有的txt设定,比如npc/msg/itemset/enemy等等bbs.mocwww.com0 Z2 t, x3 P' C% ?# ^
记住编号不要随意乱设置,尽量往小的,没用到的设定
$ r& s% Y0 g2 q4 J魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表比如你不要把一个msg的编号设定成390000000,三亿多了妖城在线论坛9 d- Y3 J! {/ I! c/ d% H6 C
因为在程序的逻辑里,我不可能为了寻找到某个编号,就每次去整个msg里面从上到下循环搜索吧?妖城在线论坛1 J2 P4 C9 m2 p& v
所以程序逻辑,会在服务端启动的时候,就根据你msg的最大编号为上限,设定一个跳转表。妖城在线论坛. Q4 ?& k: r' @8 [
对程序员来说,讲到这里应该就懂了bbs.mocwww.com' d& ?" t, p, N( g
但是对于非程序员来说,我多说两句,跳转表是为了快速定位数据不需要从上到下循环搜索的。
- D7 \6 p& p, a6 I5 G# L你可以理解跳转表是连续的一堆信息。
- P& b8 k% Y+ C' Z魔力私服,最新魔力宝贝私服技术交流你的msg编号最大的如果是100000,那么程序启动的时候就会设定10万个连续的数据空间用来存放对应每个msg编号指向msg.txt的哪一行。
& N5 o+ C" d* Ubbs.mocwww.com这样,当游戏里,需要调用到某个msg的时候(比如道具说明啊,npc对话啊,boss发言啊之类的)—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート* _( P. T) L, s0 L/ n
它直接通过编号获取跳转表指向的msg行,获取到msg的内容。
2 Y! k) j( r' w5 f/ gbbs.mocwww.com这就导致了一个问题,你要是把msg的最大编号设置成3亿多。。。。可想而知浪费了多少内存?
4 D, b$ W2 j5 z0 j9 w魔力私服,最新魔力宝贝私服技术交流
2 `+ T) o( d8 e" Z% Edata下的其它文档也是一样的道理。用编号,不要太任性。
. [8 d, ~- j& ]魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表妖城在线论坛* T5 C* X& ~. H4 l- ~
二:lua方面—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート4 \" E! b" [/ O  i, d+ e
lua方面最大的内存占用,应该就是table类型的反复释放和创建了。bbs.mocwww.com4 O8 t/ w# D- a' }! h9 Y4 C: \( N
因为没有深入阅读lua的代码
2 o& E& D; }; F魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表所以对于lua的内存管理一直是很懵的。bbs.mocwww.com( Q- H; L; p# M3 e, W- j( }$ u4 d
如果没有对内存占用比较敏感的话
% r' \3 B9 G7 i+ A/ C2 C( p( H妖城在线论坛正常运行的服务器,一般都会给每个玩家登陆的时候,或者玩家某个行为的时候,创建一个临时的tabble
+ u% D1 Z$ `) r5 l1 z0 }bbs.mocwww.com这个table的生命周期仅限于这玩家本次登录的时候。
6 R* o2 k# h9 [0 {bbs.mocwww.com然后玩家下线了,就释放掉,比如tablexx=nil
8 E6 V7 V$ p( J1 B: l. \: |魔力私服,最新魔力宝贝私服技术交流但是这样做有一个问题。。。
$ X, t3 l0 M, Z1 q5 q9 ~0 o. \9 M—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート你可以尝试一个玩家登陆的时候,你创建一个百万级别的table项目。
# i- ~* ^' C/ M1 l  P( W8 }$ r" N% x6 ~玩家下线的时候,你nil掉这个table
( R3 L; m6 ^' h# |' J4 o; l% S魔力私服,最新魔力宝贝私服技术交流并且你也可以及时得使用lua的垃圾回收释放无效的内存。
4 s+ G7 ^, Q+ h/ p) B; j2 fbbs.mocwww.com但问题是,你垃圾回收后,你读取lua的占用内存,发现确实下降了—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート0 Z: T/ N' R; n7 O3 h+ @; d) H" H
但是在linux下用系统命令top查看。。。。。魔力私服,最新魔力宝贝私服技术交流' w/ U5 M5 i2 H9 q: G: C
魔力服务端所占用的内存毫无下降。
4 e* n3 L# s, f- I魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表那么你再次登陆角色,又创建了一批内存
, y/ A9 t" y: N2 B) o2 e* O妖城在线论坛我至今依然没有通读lua引擎的代码,所以依然不能确定lua的内存管理方式。
/ P# L, T8 j( q9 s/ r, Q- {8 ~bbs.mocwww.com但是根据这段时间的测试—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート: u, O2 _# }( O7 Z/ u
可以总结经验(并不一定对):lua会霸占整个系统的内存,并以你目前最大用到的多少为限,你用lua的垃圾回收功能,是回收了9 y$ Q1 J) g% X# m3 o
但是这部分内存并不归还给linux系统妖城在线论坛% ?) E; |0 i+ h7 @
lua会认为,你既然现在能用到这个尺度的内存,那我留着,你等下迟早也要用到。。。。。bbs.mocwww.com* ?' ^* Z( Y" c- X
这就导致了,不停的table的nil释放并不能真正释放整个魔力服务端运行时占用的内存魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表4 o5 w/ T2 R! Q1 ~/ [7 [% X- i
这个跟正常的编程意识就有点不符合了。。。。。。魔力私服,最新魔力宝贝私服技术交流% d) G0 j4 {0 l' Q; ~) T
但反正它大概是这么操作的。  |. l) S) b. a2 v
解决方案是什么呢?妖城在线论坛+ h$ d: s. I' @! J5 [8 Y6 y4 A! J& M2 z
不要用cdkey啥的做table的key(如果非要不可,我感觉宁愿弄成field存到数据库中)bbs.mocwww.com( L2 S6 F$ @9 t5 g
启动的时候,根据当前设定的最大在线人数,预先扩充一个table魔力私服,最新魔力宝贝私服技术交流  _. k( g% N/ f/ B3 n! o: p' ~
这个table的索引key使用CharIndex这个序号  T! U% H! ?: Q0 ]/ ]4 t
玩家下线的时候,不要nil掉,只要再次初始化数据就好了。
; s  p4 n. V7 r魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表这样就不会反复创建了& J# c( b% u! O% }" {

, n& ]# Q, f6 m  G; s0 Z' b$ e2 H) l魔力私服,最新魔力宝贝私服技术交流三:引擎,c语言方面2 D3 m9 i) M# A
也是同样的观点。
: h9 F( k/ j1 `7 K$ w( i& R5 D4 Tbbs.mocwww.com尽量预设开辟一段既定的内存空间,不要试图去在登陆和登出的时候频繁的创建和释放魔力私服,最新魔力宝贝私服技术交流& s2 D5 i$ ?5 D! j0 @! r4 H# D
魔力私服,最新魔力宝贝私服技术交流6 B/ [) }3 N7 N7 u9 y
最初妖城启动占用内存大概2.3g,运行大概十天半个月后,就会出现内存溢出,轻则挂端重则回档。
. D# _  k+ [: t妖城在线论坛后来优化后(其实没有优化到极致)启动占用内存800m左右,干净的系统top下观察占用内存1g而已魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表$ e2 I/ J4 l  a% w- `
连续运行几个月都不会有问题。
# V/ N/ B/ d* U* z1 \/ @bbs.mocwww.com
! ]/ J* t) s5 W8 A  O# [魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表以上说的三个方面魔力私服,最新魔力宝贝私服技术交流: b/ ~( J8 P4 |
两个都是一般的开服的gm自己可以控制优化的,第三个是必须引擎技术商方面优化的。妖城在线论坛: N$ R3 c- k$ _# Z9 i, m" w/ k
妖城在线论坛% W4 V- Y, X, ?( o; M
大家可以试一下
妖城欢迎您!

TOP

补充几点
$ q' G' C% I3 T% Z9 Q) G0 b/ Q—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート1. 关于可用内存,实际上linux上面只有3g,windows下面只有2g
) f2 U+ J' G& X; K; \% B' r2 w2. luajit 可用内存是2g,除非 64位+GC64模式
" k% c* T' T8 o+ ~( e( k7 \魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表2.1. 内存回收,lua 申请的内存看luajit的实现了,默认跟c一样的处理逻辑,但如果是myalloc的话,大概率会有内存泄漏,不过就算是c的内存申请后也不是马上归回系统的。
1 b# s' t8 `) v2 f: @  M3 Kbbs.mocwww.com3. gmsv里面动态申请的数据主要是迷宫,不过引擎的myalloc,大概率会有内存泄漏妖城在线论坛5 S  Z& ?" ~1 E" P7 r- Y' E! ~0 b
魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表5 R  c& l8 p- S  \7 c
[ 本帖最后由 Muscipular 于 2023-5-15 12:40 编辑 ]

TOP

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

TOP

发新话题