发新话题
打印

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

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

大家也知道,妖城魔力一个区开服了十周年多了妖城在线论坛' G. G$ ]4 g+ i! Y1 q/ d+ o

7 ]3 v# U, u, {" g4 c$ g* l& Q/ B魔力私服,最新魔力宝贝私服技术交流不管是数据库还是data的冗余肯定都非常多。
& G  s1 |' }5 N
, u: q4 r+ R) C: t* Obbs.mocwww.com对于妖城这样的数据量大的服务器,首先数据库肯定不能放在跟服务端运行的同一个服务器里。
# j+ ~% D) ~. |4 T
2 N3 E* k; {3 H' V- L9 D4 N# Tbbs.mocwww.com这是基本的,所以,最好是运行服务端的服务器一台,数据库单独一台。妖城在线论坛! n; @3 Y' G. F( c! t- O

1 Z1 B4 P% h- D- o6 r5 t魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表因为数据库大了之后,mysql的资源占用也是很可观的。能省则省。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート" A" X: F0 t+ _* l- Q/ l7 c

! y% _4 N- l% m3 k( K' f魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表然后关于在有限资源的前提下(魔力原生的服务端是只能运行32位系统的,也就是最大4g内存,后续可能有别的引擎升级兼容了64位那另说)
1 m- u8 }0 E$ E, w3 S0 }魔力私服,最新魔力宝贝私服技术交流bbs.mocwww.com+ T- ?1 h% D% q- p% U
优化有两个方面魔力私服,最新魔力宝贝私服技术交流5 C5 P2 h' v* c$ |. t, c* |
一:data方面魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表7 q/ Y( u; B6 m" \( J' _& T6 g) C8 q
data下几乎所有的txt设定,比如npc/msg/itemset/enemy等等魔力私服,最新魔力宝贝私服技术交流! A+ @9 q, A. m* k+ |6 J
记住编号不要随意乱设置,尽量往小的,没用到的设定魔力私服,最新魔力宝贝私服技术交流. b" ^! ~% Q* {; [
比如你不要把一个msg的编号设定成390000000,三亿多了
. O% m  i$ K4 `% J8 k) R( ^4 d4 [妖城在线论坛因为在程序的逻辑里,我不可能为了寻找到某个编号,就每次去整个msg里面从上到下循环搜索吧?魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表# N: P0 Y; P8 l6 [5 S2 x
所以程序逻辑,会在服务端启动的时候,就根据你msg的最大编号为上限,设定一个跳转表。
6 I" m& [7 Q3 D& k7 fbbs.mocwww.com对程序员来说,讲到这里应该就懂了魔力私服,最新魔力宝贝私服技术交流# i3 o7 g: `% b% d7 l$ Q" o
但是对于非程序员来说,我多说两句,跳转表是为了快速定位数据不需要从上到下循环搜索的。妖城在线论坛/ q" W; S% \. \2 X& X5 s, o7 _
你可以理解跳转表是连续的一堆信息。
0 {) D# K& A- H/ c- k% P1 ybbs.mocwww.com你的msg编号最大的如果是100000,那么程序启动的时候就会设定10万个连续的数据空间用来存放对应每个msg编号指向msg.txt的哪一行。
' \$ x! e- z+ `1 U, a/ @: E—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート这样,当游戏里,需要调用到某个msg的时候(比如道具说明啊,npc对话啊,boss发言啊之类的)" i9 }* h3 l. X- k
它直接通过编号获取跳转表指向的msg行,获取到msg的内容。魔力私服,最新魔力宝贝私服技术交流  t2 e7 b1 c) m& G  v9 A
这就导致了一个问题,你要是把msg的最大编号设置成3亿多。。。。可想而知浪费了多少内存?妖城在线论坛3 y3 d# K& i, F5 r0 m* P) P; t, D# H: N

! d8 k6 q) o) j* ]* H0 s* `# vdata下的其它文档也是一样的道理。用编号,不要太任性。妖城在线论坛9 f- h' ~$ ^% e; x
魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表: E3 i$ Y0 B' T/ v4 J# w& s9 s# k
二:lua方面
4 G8 O# W# f/ b( o! V2 J& a0 X; abbs.mocwww.comlua方面最大的内存占用,应该就是table类型的反复释放和创建了。bbs.mocwww.com5 v, X/ u: `% Y9 x2 |3 D; r  |
因为没有深入阅读lua的代码
' {; m% b0 v; o7 o) e) sbbs.mocwww.com所以对于lua的内存管理一直是很懵的。
$ v2 y( o+ m2 }7 L7 G/ j1 M. q如果没有对内存占用比较敏感的话
3 S( j, ?9 `0 Tbbs.mocwww.com正常运行的服务器,一般都会给每个玩家登陆的时候,或者玩家某个行为的时候,创建一个临时的tabble魔力私服,最新魔力宝贝私服技术交流0 C0 T* p! {+ b+ d& V$ Q
这个table的生命周期仅限于这玩家本次登录的时候。妖城在线论坛6 |0 Z8 w. R) O# i
然后玩家下线了,就释放掉,比如tablexx=nil魔力私服,最新魔力宝贝私服技术交流9 n  q" ]0 ]4 k+ v: O
但是这样做有一个问题。。。
* i# g. _1 V; }( S0 g/ y) a妖城在线论坛你可以尝试一个玩家登陆的时候,你创建一个百万级别的table项目。2 J% k7 A, ~( a+ O* i) ~
玩家下线的时候,你nil掉这个tablebbs.mocwww.com0 A* d" l8 \% `. `6 F) |
并且你也可以及时得使用lua的垃圾回收释放无效的内存。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート7 I9 W& j  q% M( m$ @
但问题是,你垃圾回收后,你读取lua的占用内存,发现确实下降了魔力私服,最新魔力宝贝私服技术交流. N1 B; G0 W9 v2 ~
但是在linux下用系统命令top查看。。。。。
/ h) f& u: o2 K, e3 c妖城在线论坛魔力服务端所占用的内存毫无下降。
! l3 Y2 {9 ~- [) p, W7 l5 Z) h* a魔力私服,最新魔力宝贝私服技术交流那么你再次登陆角色,又创建了一批内存
6 }. d* W, J6 G8 z9 m; h妖城在线论坛我至今依然没有通读lua引擎的代码,所以依然不能确定lua的内存管理方式。bbs.mocwww.com1 P$ y  i, ~  f5 T
但是根据这段时间的测试bbs.mocwww.com8 K/ e& `+ f% t3 c. M# z; J
可以总结经验(并不一定对):lua会霸占整个系统的内存,并以你目前最大用到的多少为限,你用lua的垃圾回收功能,是回收了—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート7 |6 E  g' z, x3 B" h8 T0 o& `
但是这部分内存并不归还给linux系统
  B/ k5 _- o. x" w# L6 F2 w9 X魔力私服,最新魔力宝贝私服技术交流lua会认为,你既然现在能用到这个尺度的内存,那我留着,你等下迟早也要用到。。。。。
5 x) V5 M- Q  u魔力私服,最新魔力宝贝私服技术交流这就导致了,不停的table的nil释放并不能真正释放整个魔力服务端运行时占用的内存—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート0 q. x" a: O. E  x4 \2 W! n& s
这个跟正常的编程意识就有点不符合了。。。。。。8 D2 \# z3 i3 Y# Y# D/ j
但反正它大概是这么操作的。
2 S% P# s. S$ v; k- I" h解决方案是什么呢?
% ^6 z2 N. B, A4 v* ?不要用cdkey啥的做table的key(如果非要不可,我感觉宁愿弄成field存到数据库中)
* P9 A: I, N8 C5 ?8 s! {3 {—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート启动的时候,根据当前设定的最大在线人数,预先扩充一个table
/ b- C8 V/ v: i; l魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表这个table的索引key使用CharIndex这个序号bbs.mocwww.com; V& E0 v3 i' X6 t1 X
玩家下线的时候,不要nil掉,只要再次初始化数据就好了。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート" ~& V4 d* i# e$ y0 P
这样就不会反复创建了bbs.mocwww.com, t  h) g3 g- c0 ?

9 s' ]8 k% ?+ j8 U( xbbs.mocwww.com三:引擎,c语言方面
8 Z8 {  x8 p$ C' o也是同样的观点。妖城在线论坛1 Y( T, r4 t9 X8 W) d' P
尽量预设开辟一段既定的内存空间,不要试图去在登陆和登出的时候频繁的创建和释放bbs.mocwww.com) P+ T. H9 D: d' l3 O: J

5 A* A  g  _' G; n: F2 E( i最初妖城启动占用内存大概2.3g,运行大概十天半个月后,就会出现内存溢出,轻则挂端重则回档。
' i3 w5 U, u( |—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート后来优化后(其实没有优化到极致)启动占用内存800m左右,干净的系统top下观察占用内存1g而已3 T; R  k$ E" c; J4 g, b
连续运行几个月都不会有问题。妖城在线论坛4 T: ]8 ?# h& D0 F
bbs.mocwww.com& a5 W3 @5 \# L
以上说的三个方面bbs.mocwww.com0 u0 b0 M' o2 D  }5 o0 g
两个都是一般的开服的gm自己可以控制优化的,第三个是必须引擎技术商方面优化的。
( }% S( N2 P* E  O, B& s, a2 i—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲートbbs.mocwww.com+ C* F. Z' n: @3 A3 X
大家可以试一下
妖城欢迎您!

TOP

补充几点& T, f7 i8 I8 V: A  C
1. 关于可用内存,实际上linux上面只有3g,windows下面只有2g
- I8 R5 F* g& k6 l$ e0 r' m8 m魔力私服,最新魔力宝贝私服技术交流2. luajit 可用内存是2g,除非 64位+GC64模式. m& U( _  B# y# Y& g
2.1. 内存回收,lua 申请的内存看luajit的实现了,默认跟c一样的处理逻辑,但如果是myalloc的话,大概率会有内存泄漏,不过就算是c的内存申请后也不是马上归回系统的。魔力私服,最新魔力宝贝私服技术交流* f/ \$ [* Z# i, x* k
3. gmsv里面动态申请的数据主要是迷宫,不过引擎的myalloc,大概率会有内存泄漏妖城在线论坛2 y0 X2 y/ [' {% a4 I
魔力私服,最新魔力宝贝私服技术交流4 |4 _* J* n2 n; h1 C) M; v0 ]
[ 本帖最后由 Muscipular 于 2023-5-15 12:40 编辑 ]

TOP

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

TOP

发新话题