Board logo

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

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

大家也知道,妖城魔力一个区开服了十周年多了魔力私服,最新魔力宝贝私服技术交流. i. p! Q; T0 n3 h/ z
魔力私服,最新魔力宝贝私服技术交流2 Z  q9 }. v/ ^0 G$ t, F
不管是数据库还是data的冗余肯定都非常多。妖城在线论坛6 \. @6 j) l& D) \

4 \! y9 |' ^$ `& b4 a' D魔力私服,最新魔力宝贝私服技术交流对于妖城这样的数据量大的服务器,首先数据库肯定不能放在跟服务端运行的同一个服务器里。
/ t5 V3 v, k; b- U) X—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート
( }. k) f# f6 T魔力私服,最新魔力宝贝私服技术交流这是基本的,所以,最好是运行服务端的服务器一台,数据库单独一台。
$ H; u5 k0 [9 u" L5 O$ kbbs.mocwww.combbs.mocwww.com8 ?; x  f6 K5 _! q8 U( }( P
因为数据库大了之后,mysql的资源占用也是很可观的。能省则省。
# Y4 ?, x2 _. ]- j# Z妖城在线论坛魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表! I1 Y9 A1 Z4 j( y
然后关于在有限资源的前提下(魔力原生的服务端是只能运行32位系统的,也就是最大4g内存,后续可能有别的引擎升级兼容了64位那另说)
& O4 g7 M6 r3 l% F; I* n魔力私服,最新魔力宝贝私服技术交流魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表7 I. O5 K# }+ h7 B- D. c
优化有两个方面bbs.mocwww.com5 f& \' L% d  ?& L+ U
一:data方面
1 O0 O: G7 r$ k( Q: D: R- u& q) b魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表data下几乎所有的txt设定,比如npc/msg/itemset/enemy等等
6 U- S* d" e1 |+ A+ P  Cbbs.mocwww.com记住编号不要随意乱设置,尽量往小的,没用到的设定魔力私服,最新魔力宝贝私服技术交流3 s4 @/ o5 j, u6 A
比如你不要把一个msg的编号设定成390000000,三亿多了bbs.mocwww.com7 |, [, m) X* P# Y+ A4 m5 F% [
因为在程序的逻辑里,我不可能为了寻找到某个编号,就每次去整个msg里面从上到下循环搜索吧?魔力私服,最新魔力宝贝私服技术交流" h* n) Q; d  D  p( V4 n- Y9 ]
所以程序逻辑,会在服务端启动的时候,就根据你msg的最大编号为上限,设定一个跳转表。
( j; e- [+ Z- |( j7 ebbs.mocwww.com对程序员来说,讲到这里应该就懂了
, `8 p0 V# k* Z, T妖城在线论坛但是对于非程序员来说,我多说两句,跳转表是为了快速定位数据不需要从上到下循环搜索的。2 j& R; ^! H  k  |
你可以理解跳转表是连续的一堆信息。
" r3 g& B2 ~8 ]2 }! v魔力私服,最新魔力宝贝私服技术交流你的msg编号最大的如果是100000,那么程序启动的时候就会设定10万个连续的数据空间用来存放对应每个msg编号指向msg.txt的哪一行。" U% ]) R- F2 \5 ^, }' K7 i, {0 \
这样,当游戏里,需要调用到某个msg的时候(比如道具说明啊,npc对话啊,boss发言啊之类的)
; t" ^* a4 d+ r/ x$ Y* P. s) ebbs.mocwww.com它直接通过编号获取跳转表指向的msg行,获取到msg的内容。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート, r! r4 g' B  N9 G) T
这就导致了一个问题,你要是把msg的最大编号设置成3亿多。。。。可想而知浪费了多少内存?—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート0 Y, D/ h5 C$ k; k

- e) Y; B1 o; G! f9 X—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲートdata下的其它文档也是一样的道理。用编号,不要太任性。妖城在线论坛( u8 {+ J: E( r

* a$ ?) y9 _% {8 v8 H1 c妖城在线论坛二:lua方面
* i6 w2 P" C4 b8 P, u3 w* x0 W0 f魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表lua方面最大的内存占用,应该就是table类型的反复释放和创建了。- s6 w1 o4 J, G6 m  u
因为没有深入阅读lua的代码魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表9 g5 R$ q! W8 u1 Q* z% P! r
所以对于lua的内存管理一直是很懵的。
  U3 j" M3 M: I+ |/ m3 j—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート如果没有对内存占用比较敏感的话
) \- j; A  ^, O2 W+ v/ {妖城在线论坛正常运行的服务器,一般都会给每个玩家登陆的时候,或者玩家某个行为的时候,创建一个临时的tabble
5 N4 A: a/ e# O, Z; h—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート这个table的生命周期仅限于这玩家本次登录的时候。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表- E" v: E- k; J, x& q1 _
然后玩家下线了,就释放掉,比如tablexx=nil
2 r' t& Y- q- h5 r魔力私服,最新魔力宝贝私服技术交流但是这样做有一个问题。。。魔力私服,最新魔力宝贝私服技术交流5 f( V, p0 p7 T" b, E. D1 e
你可以尝试一个玩家登陆的时候,你创建一个百万级别的table项目。
8 h7 \! [6 j: b$ U9 P" i妖城在线论坛玩家下线的时候,你nil掉这个table
  {, A# b9 J6 g2 M& O( _—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート并且你也可以及时得使用lua的垃圾回收释放无效的内存。
, \* {( ^0 H9 P0 h% a/ M3 D魔力私服,最新魔力宝贝私服技术交流但问题是,你垃圾回收后,你读取lua的占用内存,发现确实下降了魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表) L8 `4 O& H9 W/ U; l4 e
但是在linux下用系统命令top查看。。。。。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート3 L1 ~8 F0 ~3 U7 G
魔力服务端所占用的内存毫无下降。
4 m  x" X8 [! o) T/ [) v妖城在线论坛那么你再次登陆角色,又创建了一批内存
6 r, W  S% D( s2 P5 }bbs.mocwww.com我至今依然没有通读lua引擎的代码,所以依然不能确定lua的内存管理方式。bbs.mocwww.com/ A( U+ \5 [$ u7 H: X! W5 ^. o# `
但是根据这段时间的测试魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表; `: ^2 s* h6 f! h4 w2 i
可以总结经验(并不一定对):lua会霸占整个系统的内存,并以你目前最大用到的多少为限,你用lua的垃圾回收功能,是回收了
; s8 X8 p" N  `) H; b  jbbs.mocwww.com但是这部分内存并不归还给linux系统bbs.mocwww.com! S! g% R4 F) N+ s5 F9 O; k/ q
lua会认为,你既然现在能用到这个尺度的内存,那我留着,你等下迟早也要用到。。。。。
, X' O0 V! o4 y魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表这就导致了,不停的table的nil释放并不能真正释放整个魔力服务端运行时占用的内存$ G3 F4 @) e8 i. l7 {& |' y
这个跟正常的编程意识就有点不符合了。。。。。。/ p# x) ]( ^& j. _
但反正它大概是这么操作的。
" W- M4 z( {, {1 k+ V—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート解决方案是什么呢?
$ l' ]) S; Z3 `9 O6 @bbs.mocwww.com不要用cdkey啥的做table的key(如果非要不可,我感觉宁愿弄成field存到数据库中)bbs.mocwww.com% e2 V" r: Q, ?6 ?
启动的时候,根据当前设定的最大在线人数,预先扩充一个table魔力私服,最新魔力宝贝私服技术交流: B- L% y; Q6 F. m% p5 J& l4 @
这个table的索引key使用CharIndex这个序号
5 {& y) H  H4 ?% k) W; W—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート玩家下线的时候,不要nil掉,只要再次初始化数据就好了。
$ L0 L. L  y6 ybbs.mocwww.com这样就不会反复创建了
/ l% c7 p' e1 A- L  e$ R魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表
( Q. U9 y0 E9 z3 p2 k5 A1 kbbs.mocwww.com三:引擎,c语言方面
1 s7 M) n5 g8 L7 ^2 k! _—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート也是同样的观点。魔力私服,最新魔力宝贝私服技术交流+ y: P6 x! q: R- J& c3 u
尽量预设开辟一段既定的内存空间,不要试图去在登陆和登出的时候频繁的创建和释放
; L" }* w& S6 Q, v* Q5 q8 @
, O6 h6 R, t, U/ J妖城在线论坛最初妖城启动占用内存大概2.3g,运行大概十天半个月后,就会出现内存溢出,轻则挂端重则回档。
4 K) c* H: c9 h  M+ P' |' l5 ^/ o妖城在线论坛后来优化后(其实没有优化到极致)启动占用内存800m左右,干净的系统top下观察占用内存1g而已魔力私服,最新魔力宝贝私服技术交流( g4 i9 X0 m  m
连续运行几个月都不会有问题。
( ^( c" Y- P0 O, \' D妖城在线论坛
7 {  ]  O' E/ T6 i8 A魔力私服,最新魔力宝贝私服技术交流以上说的三个方面
, U5 [$ Z0 v- F8 ^. ^魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表两个都是一般的开服的gm自己可以控制优化的,第三个是必须引擎技术商方面优化的。
* c' h+ Y0 E4 E—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲートbbs.mocwww.com0 g9 E4 p  O* I: j  H6 K3 H# R
大家可以试一下
作者: Muscipular    时间: 2023-5-15 12:32

补充几点
* u. A% y1 w: s妖城在线论坛1. 关于可用内存,实际上linux上面只有3g,windows下面只有2g
8 ^, w/ Q5 R. l! m  p6 ubbs.mocwww.com2. luajit 可用内存是2g,除非 64位+GC64模式魔力私服,最新魔力宝贝私服技术交流2 j, ]" y+ c6 }6 `: D# ^
2.1. 内存回收,lua 申请的内存看luajit的实现了,默认跟c一样的处理逻辑,但如果是myalloc的话,大概率会有内存泄漏,不过就算是c的内存申请后也不是马上归回系统的。
! R6 p: B1 ~' r魔力私服,最新魔力宝贝私服技术交流3. gmsv里面动态申请的数据主要是迷宫,不过引擎的myalloc,大概率会有内存泄漏妖城在线论坛' h5 X# L/ |7 X! y

; I. S1 L) h8 p% U3 F2 x: ~/ y魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表[ 本帖最后由 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