发新话题
打印

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

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

大家也知道,妖城魔力一个区开服了十周年多了—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート# B0 I' ~# |2 o  Z4 S

7 s, U' a: T7 Z* X魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表不管是数据库还是data的冗余肯定都非常多。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表+ a0 d7 a2 i0 H

# w6 S9 O" ~  }6 y6 Z- R魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表对于妖城这样的数据量大的服务器,首先数据库肯定不能放在跟服务端运行的同一个服务器里。
% Y# F( u4 V& j5 X$ o—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲートbbs.mocwww.com7 W; r) ]" e/ C/ d/ o0 O7 ]
这是基本的,所以,最好是运行服务端的服务器一台,数据库单独一台。
' f, K1 I: A+ I: {4 R妖城在线论坛
: q: x4 f% a) ^1 y. I) y因为数据库大了之后,mysql的资源占用也是很可观的。能省则省。
+ ~7 Q& ]; L9 W2 R—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート) e4 t; ~1 Z, a5 [9 A4 k; Z
然后关于在有限资源的前提下(魔力原生的服务端是只能运行32位系统的,也就是最大4g内存,后续可能有别的引擎升级兼容了64位那另说)bbs.mocwww.com4 l+ ~0 w! {0 R

8 c% a2 z, ~) a$ fbbs.mocwww.com优化有两个方面
7 e4 b9 b0 c# F! j' `: J—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート一:data方面
" I  m$ p0 U3 _" k' e4 j魔力私服,最新魔力宝贝私服技术交流data下几乎所有的txt设定,比如npc/msg/itemset/enemy等等bbs.mocwww.com; h6 T# i" y3 I; k
记住编号不要随意乱设置,尽量往小的,没用到的设定
6 D5 `# K/ v" g—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート比如你不要把一个msg的编号设定成390000000,三亿多了
" ~6 U; O( D% s* A! Wbbs.mocwww.com因为在程序的逻辑里,我不可能为了寻找到某个编号,就每次去整个msg里面从上到下循环搜索吧?
( j! n- R5 A3 C- d  I3 y魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表所以程序逻辑,会在服务端启动的时候,就根据你msg的最大编号为上限,设定一个跳转表。bbs.mocwww.com9 J2 y# |- T* s" n2 d
对程序员来说,讲到这里应该就懂了
# N. E! Z0 P; b1 `& u& [1 ]5 E—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート但是对于非程序员来说,我多说两句,跳转表是为了快速定位数据不需要从上到下循环搜索的。
% O! a4 I" V4 {- t! ^( o/ J! e. @# Y魔力私服,最新魔力宝贝私服技术交流你可以理解跳转表是连续的一堆信息。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート/ e1 ^. T/ F' |4 p
你的msg编号最大的如果是100000,那么程序启动的时候就会设定10万个连续的数据空间用来存放对应每个msg编号指向msg.txt的哪一行。
$ [5 t1 O) L& ~/ w1 H这样,当游戏里,需要调用到某个msg的时候(比如道具说明啊,npc对话啊,boss发言啊之类的)
0 u2 l+ j! u9 s魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表它直接通过编号获取跳转表指向的msg行,获取到msg的内容。魔力私服,最新魔力宝贝私服技术交流, K' y7 B2 |0 q4 d9 X# N- y7 c* d
这就导致了一个问题,你要是把msg的最大编号设置成3亿多。。。。可想而知浪费了多少内存?—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート+ ]( h  p. E$ A, t
魔力私服,最新魔力宝贝私服技术交流" `& h) W. q. }# z: J+ I
data下的其它文档也是一样的道理。用编号,不要太任性。
8 O, Y3 Z1 d; l, J8 v: S( g4 a4 g魔力私服,最新魔力宝贝私服技术交流
- _# s  h4 o) W; C% z魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表二:lua方面
3 t' A7 |- l  m" z9 }, M妖城在线论坛lua方面最大的内存占用,应该就是table类型的反复释放和创建了。
+ S/ o5 G! ?2 Y8 @2 _因为没有深入阅读lua的代码
) u; \1 X* T, E, [! W魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表所以对于lua的内存管理一直是很懵的。
$ Y; a* t/ S- ^魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表如果没有对内存占用比较敏感的话
* J  `6 e9 M( |! e" R, ~妖城在线论坛正常运行的服务器,一般都会给每个玩家登陆的时候,或者玩家某个行为的时候,创建一个临时的tabble魔力私服,最新魔力宝贝私服技术交流& n' _7 h5 Q/ }: o; a6 V/ X9 N
这个table的生命周期仅限于这玩家本次登录的时候。妖城在线论坛, }2 [4 z) Y* f' B- n+ u# R+ D
然后玩家下线了,就释放掉,比如tablexx=nil
, x/ l! X+ j/ {4 _# J妖城在线论坛但是这样做有一个问题。。。
, s4 p5 G* c6 X! N' Y% }" ^! I你可以尝试一个玩家登陆的时候,你创建一个百万级别的table项目。: i1 y% J  e/ g. G
玩家下线的时候,你nil掉这个table妖城在线论坛$ U9 \; }" @% x0 i- P. D% B/ D
并且你也可以及时得使用lua的垃圾回收释放无效的内存。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート+ q; b% m0 t. R" l7 L% @
但问题是,你垃圾回收后,你读取lua的占用内存,发现确实下降了
! W, W9 r) S3 z0 t8 m/ i魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表但是在linux下用系统命令top查看。。。。。
1 T  k  o1 z, h, k- ]$ u: i魔力服务端所占用的内存毫无下降。
' {- b6 R/ f/ a魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表那么你再次登陆角色,又创建了一批内存—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート4 `8 \1 }: f9 W( l& J5 v
我至今依然没有通读lua引擎的代码,所以依然不能确定lua的内存管理方式。
; A$ E) D; z" i) j% h/ o魔力私服,最新魔力宝贝私服技术交流但是根据这段时间的测试
+ K5 Y. m& ?- }- y& c5 G可以总结经验(并不一定对):lua会霸占整个系统的内存,并以你目前最大用到的多少为限,你用lua的垃圾回收功能,是回收了魔力私服,最新魔力宝贝私服技术交流5 u2 Y/ r- j, v4 @% I
但是这部分内存并不归还给linux系统
1 |5 D9 \9 f7 e5 u" P5 w# a魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表lua会认为,你既然现在能用到这个尺度的内存,那我留着,你等下迟早也要用到。。。。。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート% P6 {/ ~' |  t, K( B
这就导致了,不停的table的nil释放并不能真正释放整个魔力服务端运行时占用的内存妖城在线论坛  J+ o5 q8 B" O( I8 R/ ^* H" \: d
这个跟正常的编程意识就有点不符合了。。。。。。妖城在线论坛) Z5 _" ]1 E. w: A- J4 U
但反正它大概是这么操作的。( z) p" z' l! s6 a4 Q3 |
解决方案是什么呢?魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表* E( o. E; G0 u: \
不要用cdkey啥的做table的key(如果非要不可,我感觉宁愿弄成field存到数据库中)
3 B+ R8 \9 D- A3 k魔力私服,最新魔力宝贝私服技术交流启动的时候,根据当前设定的最大在线人数,预先扩充一个table
7 V2 V8 J2 U7 k% Q. Y- j妖城在线论坛这个table的索引key使用CharIndex这个序号2 I" |, |. h  n% o; A
玩家下线的时候,不要nil掉,只要再次初始化数据就好了。
1 W9 X/ u7 o1 a9 H: U+ @5 i; x—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート这样就不会反复创建了
! |% B0 M9 n! [8 ]8 W) `bbs.mocwww.com
  n3 F- ?5 d& Q! s" d魔力私服,最新魔力宝贝私服技术交流三:引擎,c语言方面bbs.mocwww.com2 I9 H  g) F# c8 ?
也是同样的观点。bbs.mocwww.com3 w. ]/ x8 ^; o* F$ K: C
尽量预设开辟一段既定的内存空间,不要试图去在登陆和登出的时候频繁的创建和释放
9 h: J, z8 B% a2 p. c' P妖城在线论坛
0 f; I2 X2 X: L4 G; S: j% y3 @—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート最初妖城启动占用内存大概2.3g,运行大概十天半个月后,就会出现内存溢出,轻则挂端重则回档。
9 H% t( l, w( D2 y" w' K3 q& X6 e& E妖城在线论坛后来优化后(其实没有优化到极致)启动占用内存800m左右,干净的系统top下观察占用内存1g而已妖城在线论坛# h) V8 ~" l, y+ i
连续运行几个月都不会有问题。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート0 m% H, o$ g$ e1 i8 M

) R: P- H4 e2 Z& t1 S魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表以上说的三个方面魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表/ a# G  s6 D3 T3 q2 ]+ A
两个都是一般的开服的gm自己可以控制优化的,第三个是必须引擎技术商方面优化的。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート' M) D- t$ `8 n2 j3 ~) d
妖城在线论坛9 d  R, ]2 n$ q) O2 a  n( o' c2 K
大家可以试一下
妖城欢迎您!

TOP

补充几点
% [5 _* J; r  O9 u$ H% i妖城在线论坛1. 关于可用内存,实际上linux上面只有3g,windows下面只有2g
* S/ D5 o( m+ {+ }" q( C妖城在线论坛2. luajit 可用内存是2g,除非 64位+GC64模式魔力私服,最新魔力宝贝私服技术交流6 u0 J+ p, X$ p0 b  @3 P$ [4 ~
2.1. 内存回收,lua 申请的内存看luajit的实现了,默认跟c一样的处理逻辑,但如果是myalloc的话,大概率会有内存泄漏,不过就算是c的内存申请后也不是马上归回系统的。
+ ]8 h+ o. ~$ t+ a魔力私服,最新魔力宝贝私服技术交流3. gmsv里面动态申请的数据主要是迷宫,不过引擎的myalloc,大概率会有内存泄漏
* z2 t; w% [; L7 z4 z0 s魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表% o! B1 W+ |- a0 d
[ 本帖最后由 Muscipular 于 2023-5-15 12:40 编辑 ]

TOP

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

TOP

发新话题