发新话题
打印

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

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

大家也知道,妖城魔力一个区开服了十周年多了妖城在线论坛, b8 |* P% P5 h) a  H7 c( {* A

3 y* k' ?. L2 Q, l7 Q1 E/ p5 V+ ?. P: pbbs.mocwww.com不管是数据库还是data的冗余肯定都非常多。
+ T! W* M$ i2 k' x—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート  ?% h& q% F( u% P0 W
对于妖城这样的数据量大的服务器,首先数据库肯定不能放在跟服务端运行的同一个服务器里。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表! {* u7 [4 ^+ z" n$ c
魔力私服,最新魔力宝贝私服技术交流: b5 P9 h: \. }* b
这是基本的,所以,最好是运行服务端的服务器一台,数据库单独一台。妖城在线论坛4 H$ w# i- i  y$ Q* |+ }# s
—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート) G8 s. V& v- g1 r2 {; n
因为数据库大了之后,mysql的资源占用也是很可观的。能省则省。
* g9 l- G5 I3 ?) e/ w5 f—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート( U. Y, o( Q5 ~4 i3 I& B
然后关于在有限资源的前提下(魔力原生的服务端是只能运行32位系统的,也就是最大4g内存,后续可能有别的引擎升级兼容了64位那另说)妖城在线论坛8 D8 K9 v) }$ p
/ v* b9 P* _0 s: T
优化有两个方面妖城在线论坛5 J8 j( f  V' E" G/ t
一:data方面—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート5 z1 @& |: T/ o7 e' T6 t# K" z3 M1 J
data下几乎所有的txt设定,比如npc/msg/itemset/enemy等等/ D# }+ M& `4 q( R" S
记住编号不要随意乱设置,尽量往小的,没用到的设定
) N8 I: k3 f. r  _/ I3 F魔力私服,最新魔力宝贝私服技术交流比如你不要把一个msg的编号设定成390000000,三亿多了魔力私服,最新魔力宝贝私服技术交流+ t0 I4 ]% G( O0 M  T0 W
因为在程序的逻辑里,我不可能为了寻找到某个编号,就每次去整个msg里面从上到下循环搜索吧?
! K, K8 F4 {0 \3 C' |) q—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート所以程序逻辑,会在服务端启动的时候,就根据你msg的最大编号为上限,设定一个跳转表。
2 P( b; p8 W' ?8 F* Z3 X妖城在线论坛对程序员来说,讲到这里应该就懂了妖城在线论坛8 ]) Q; z' y" L4 P9 X- b+ h
但是对于非程序员来说,我多说两句,跳转表是为了快速定位数据不需要从上到下循环搜索的。
2 g4 W' f$ n7 i0 j魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表你可以理解跳转表是连续的一堆信息。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表' {  _* X8 b6 ~5 ^% f7 I) o
你的msg编号最大的如果是100000,那么程序启动的时候就会设定10万个连续的数据空间用来存放对应每个msg编号指向msg.txt的哪一行。
1 @6 `& w1 V/ j% |这样,当游戏里,需要调用到某个msg的时候(比如道具说明啊,npc对话啊,boss发言啊之类的)
! b8 {' |" s6 Q3 u魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表它直接通过编号获取跳转表指向的msg行,获取到msg的内容。魔力私服,最新魔力宝贝私服技术交流" b7 u' O' q2 I& [, S
这就导致了一个问题,你要是把msg的最大编号设置成3亿多。。。。可想而知浪费了多少内存?—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート! l/ I0 ]. t7 q$ W1 T
/ q& E2 C8 V9 `: O( g; v6 u" r+ ~$ f
data下的其它文档也是一样的道理。用编号,不要太任性。& d, k% n) L# ~. H: L$ g

2 \! [( ?' \2 z1 R' W* hbbs.mocwww.com二:lua方面—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート; ?1 y: n( X2 U- z
lua方面最大的内存占用,应该就是table类型的反复释放和创建了。
- p6 N8 j$ h4 T! j( z3 g4 h9 {因为没有深入阅读lua的代码
* {" `& Y% G" [  r  `所以对于lua的内存管理一直是很懵的。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート- x; l0 R, i3 n& z9 r7 s8 r2 _: P
如果没有对内存占用比较敏感的话—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート0 T) P8 Z# X  S
正常运行的服务器,一般都会给每个玩家登陆的时候,或者玩家某个行为的时候,创建一个临时的tabble魔力私服,最新魔力宝贝私服技术交流( W2 ^" O; h; L
这个table的生命周期仅限于这玩家本次登录的时候。
; p  |) u9 F- F7 L2 A魔力私服,最新魔力宝贝私服技术交流然后玩家下线了,就释放掉,比如tablexx=nil妖城在线论坛' ^" R- F8 J- {2 S
但是这样做有一个问题。。。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表8 ^3 f" f1 F+ d3 a! B$ G
你可以尝试一个玩家登陆的时候,你创建一个百万级别的table项目。妖城在线论坛% L& u& v3 A! P& c
玩家下线的时候,你nil掉这个table
, W! s/ ^$ }* Y  q+ J魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表并且你也可以及时得使用lua的垃圾回收释放无效的内存。
$ n5 Z9 O. k% G/ R6 X6 g1 ~魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表但问题是,你垃圾回收后,你读取lua的占用内存,发现确实下降了妖城在线论坛+ G; ^* @  I& v3 Q
但是在linux下用系统命令top查看。。。。。bbs.mocwww.com8 t4 O- j8 l& a5 A  }6 `
魔力服务端所占用的内存毫无下降。妖城在线论坛# u% B; P! I% @
那么你再次登陆角色,又创建了一批内存bbs.mocwww.com$ v' k4 ?( B1 b1 Y; O
我至今依然没有通读lua引擎的代码,所以依然不能确定lua的内存管理方式。魔力私服,最新魔力宝贝私服技术交流5 T5 X  W0 N2 d% d/ o) E. P
但是根据这段时间的测试魔力私服,最新魔力宝贝私服技术交流, i$ {2 T' r1 J- p1 _- m
可以总结经验(并不一定对):lua会霸占整个系统的内存,并以你目前最大用到的多少为限,你用lua的垃圾回收功能,是回收了bbs.mocwww.com- z( x% z! X4 [$ h
但是这部分内存并不归还给linux系统
& r" d- e  e7 g, B—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲートlua会认为,你既然现在能用到这个尺度的内存,那我留着,你等下迟早也要用到。。。。。
( L7 d* K' s( U( i& \) z7 v  c魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表这就导致了,不停的table的nil释放并不能真正释放整个魔力服务端运行时占用的内存
8 i2 s7 Y, {9 a2 W9 q  f. A魔力私服,最新魔力宝贝私服技术交流这个跟正常的编程意识就有点不符合了。。。。。。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表2 M9 A$ G& ^+ ]6 o/ a: x  ?0 F0 g
但反正它大概是这么操作的。6 ?9 Z* w# j6 Y( {! I
解决方案是什么呢?
) q- \! n. c# D* v: p! p魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表不要用cdkey啥的做table的key(如果非要不可,我感觉宁愿弄成field存到数据库中)
) f+ V7 U2 l# ?* ^6 fbbs.mocwww.com启动的时候,根据当前设定的最大在线人数,预先扩充一个table
, h+ e& G/ e2 Y) p! u8 G" t2 Z9 Q这个table的索引key使用CharIndex这个序号$ _9 W$ b+ q, d  D
玩家下线的时候,不要nil掉,只要再次初始化数据就好了。魔力私服,最新魔力宝贝私服技术交流: q1 c$ p5 L3 L9 P$ X8 x
这样就不会反复创建了魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表1 e- k- I" i% G/ N" x

7 R- `  _( `; }9 O: Z# i* I魔力私服,最新魔力宝贝私服技术交流三:引擎,c语言方面妖城在线论坛* L  M: L/ k- R% X. Z) u
也是同样的观点。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表9 T' m& z; k2 b# Q" r( S
尽量预设开辟一段既定的内存空间,不要试图去在登陆和登出的时候频繁的创建和释放# E% g7 B4 f3 u: |/ H
魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表8 b; e" K9 Q- G, Z, E; p
最初妖城启动占用内存大概2.3g,运行大概十天半个月后,就会出现内存溢出,轻则挂端重则回档。
+ }4 F4 f' i6 B; M! G+ p* b4 p—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート后来优化后(其实没有优化到极致)启动占用内存800m左右,干净的系统top下观察占用内存1g而已—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート6 \5 u( c6 r- w+ A
连续运行几个月都不会有问题。
' F& t3 I2 E$ E—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲートbbs.mocwww.com; s: J8 O* l  S
以上说的三个方面魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表) k5 L% O( f  t% D+ J3 [; A
两个都是一般的开服的gm自己可以控制优化的,第三个是必须引擎技术商方面优化的。
' p1 i- [, v, P2 r魔力私服,最新魔力宝贝私服技术交流魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表5 A# n) I* ?) w. u6 O- x& Z. W. R
大家可以试一下
妖城欢迎您!

TOP

补充几点
' S8 m3 z  n2 T" W# ?8 r魔力私服,最新魔力宝贝私服技术交流1. 关于可用内存,实际上linux上面只有3g,windows下面只有2g
7 p6 h6 F; s: M. w0 i" S# C—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート2. luajit 可用内存是2g,除非 64位+GC64模式—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート9 E5 X9 |  l5 Z
2.1. 内存回收,lua 申请的内存看luajit的实现了,默认跟c一样的处理逻辑,但如果是myalloc的话,大概率会有内存泄漏,不过就算是c的内存申请后也不是马上归回系统的。9 J( s' A, F- H
3. gmsv里面动态申请的数据主要是迷宫,不过引擎的myalloc,大概率会有内存泄漏. b) `; c+ k3 l
% ?* k( a7 E$ Z8 n' J1 e
[ 本帖最后由 Muscipular 于 2023-5-15 12:40 编辑 ]

TOP

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

TOP

发新话题