发新话题
打印

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

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

大家也知道,妖城魔力一个区开服了十周年多了魔力私服,最新魔力宝贝私服技术交流5 ]' C, o! F" u  s! G8 |; B1 }

/ O! m' y; a8 T% ]# C# `bbs.mocwww.com不管是数据库还是data的冗余肯定都非常多。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表9 [: }- H% Y9 e. P+ i, `# h" g

2 b4 L2 ~, _+ ~7 f—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート对于妖城这样的数据量大的服务器,首先数据库肯定不能放在跟服务端运行的同一个服务器里。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表+ A/ g" y6 _. ^2 d

9 W+ F3 n$ N/ ?, ]bbs.mocwww.com这是基本的,所以,最好是运行服务端的服务器一台,数据库单独一台。
9 {# B1 n6 N' e+ D妖城在线论坛$ ^/ L% C) ~3 _& D* f% [9 r
因为数据库大了之后,mysql的资源占用也是很可观的。能省则省。
, \0 c, K) f. N) K5 M+ n4 W魔力私服,最新魔力宝贝私服技术交流—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート( G/ B; z1 _" }
然后关于在有限资源的前提下(魔力原生的服务端是只能运行32位系统的,也就是最大4g内存,后续可能有别的引擎升级兼容了64位那另说)bbs.mocwww.com2 C! J2 L+ m8 C* L; q
魔力私服,最新魔力宝贝私服技术交流2 u/ ]. D3 \7 q
优化有两个方面妖城在线论坛4 U# _/ c- k' z1 Q& [8 q- l
一:data方面妖城在线论坛& K. x- w" ^$ S5 j+ O- r+ M
data下几乎所有的txt设定,比如npc/msg/itemset/enemy等等bbs.mocwww.com! z+ R$ v9 v( J+ a, l- k
记住编号不要随意乱设置,尽量往小的,没用到的设定
" `# b7 U8 h( B5 D+ l9 f—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート比如你不要把一个msg的编号设定成390000000,三亿多了魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表# G1 `6 X& q) w' T( f( a4 @( e
因为在程序的逻辑里,我不可能为了寻找到某个编号,就每次去整个msg里面从上到下循环搜索吧?
( r4 W* B; L& O( H9 ?0 |& J0 u% V—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート所以程序逻辑,会在服务端启动的时候,就根据你msg的最大编号为上限,设定一个跳转表。
% x# ]; i3 [, V* y—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート对程序员来说,讲到这里应该就懂了
) W  n8 O1 r* g% \* z—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート但是对于非程序员来说,我多说两句,跳转表是为了快速定位数据不需要从上到下循环搜索的。
. T$ P- Z# C& c1 V1 p3 kbbs.mocwww.com你可以理解跳转表是连续的一堆信息。
) r+ O' [( z, L2 n8 ]—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート你的msg编号最大的如果是100000,那么程序启动的时候就会设定10万个连续的数据空间用来存放对应每个msg编号指向msg.txt的哪一行。2 K7 n" H+ H' @6 U" h! g
这样,当游戏里,需要调用到某个msg的时候(比如道具说明啊,npc对话啊,boss发言啊之类的)
6 R1 G& }8 D3 ]( H( g它直接通过编号获取跳转表指向的msg行,获取到msg的内容。
  m8 m! E& v2 v) }  c5 @魔力私服,最新魔力宝贝私服技术交流这就导致了一个问题,你要是把msg的最大编号设置成3亿多。。。。可想而知浪费了多少内存?8 B) E8 _, Q3 m' I; X

& V; ]% S! ]. y$ c5 H2 U' Cdata下的其它文档也是一样的道理。用编号,不要太任性。4 A" q3 |5 |& \$ f2 i
  z6 d0 x$ @' A% t; j" L
二:lua方面—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート" R! y& n! B- g! @/ }% C* Q7 C
lua方面最大的内存占用,应该就是table类型的反复释放和创建了。
2 I- J7 M' M+ m5 M6 H, u2 ?因为没有深入阅读lua的代码—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート  X+ @5 O9 @/ w+ r  t' {( |5 L
所以对于lua的内存管理一直是很懵的。魔力私服,最新魔力宝贝私服技术交流6 M% g& Q% v& M  e  F
如果没有对内存占用比较敏感的话
0 {! q. p  z( `bbs.mocwww.com正常运行的服务器,一般都会给每个玩家登陆的时候,或者玩家某个行为的时候,创建一个临时的tabble—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート) [. V& O/ d! [" j0 Q6 L
这个table的生命周期仅限于这玩家本次登录的时候。
6 F) s& D8 y+ o# F1 I3 M5 a5 e妖城在线论坛然后玩家下线了,就释放掉,比如tablexx=nil
: d; u" \/ e3 r妖城在线论坛但是这样做有一个问题。。。bbs.mocwww.com- z. A. \, E! D, K5 n4 h4 ^
你可以尝试一个玩家登陆的时候,你创建一个百万级别的table项目。5 U' {: }6 U( i" Q  @2 u
玩家下线的时候,你nil掉这个table魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表5 U+ [- R3 \/ H: w/ @
并且你也可以及时得使用lua的垃圾回收释放无效的内存。妖城在线论坛: G9 L0 x5 C) ^/ ]$ p
但问题是,你垃圾回收后,你读取lua的占用内存,发现确实下降了
) l. R4 `/ e- K—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート但是在linux下用系统命令top查看。。。。。妖城在线论坛# [( O, V$ Y0 v
魔力服务端所占用的内存毫无下降。' n, }9 x4 D! Y. f" k
那么你再次登陆角色,又创建了一批内存
. Z$ A2 T0 T# o6 c5 Y! V魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表我至今依然没有通读lua引擎的代码,所以依然不能确定lua的内存管理方式。
8 }, _7 h6 O/ {* T1 Y( v) Y+ vbbs.mocwww.com但是根据这段时间的测试妖城在线论坛8 f6 i1 R; S1 P
可以总结经验(并不一定对):lua会霸占整个系统的内存,并以你目前最大用到的多少为限,你用lua的垃圾回收功能,是回收了
- a+ ~$ [4 n2 c. s/ m魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表但是这部分内存并不归还给linux系统bbs.mocwww.com0 ~, D+ o- t9 e  B" x
lua会认为,你既然现在能用到这个尺度的内存,那我留着,你等下迟早也要用到。。。。。
  V$ }' }3 \# \; Z, p, @魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表这就导致了,不停的table的nil释放并不能真正释放整个魔力服务端运行时占用的内存
! v7 {% N2 ^) R$ [bbs.mocwww.com这个跟正常的编程意识就有点不符合了。。。。。。
; W0 R) U! C8 B6 c魔力私服,最新魔力宝贝私服技术交流但反正它大概是这么操作的。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート! G) K; D$ |3 w! B4 _
解决方案是什么呢?
  R% b+ z/ f: B4 M7 E  ?, v9 L8 F魔力私服,最新魔力宝贝私服技术交流不要用cdkey啥的做table的key(如果非要不可,我感觉宁愿弄成field存到数据库中)
8 h; @' K4 W$ R$ n3 l8 T- L' w—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート启动的时候,根据当前设定的最大在线人数,预先扩充一个table魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表5 Z& a2 L0 `+ l8 p# i0 Y
这个table的索引key使用CharIndex这个序号—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート) L" e' a5 y0 D6 x
玩家下线的时候,不要nil掉,只要再次初始化数据就好了。
# i: k9 R# m  @3 s% _3 Qbbs.mocwww.com这样就不会反复创建了8 a) @) g+ Y2 B0 O# ^5 A

0 u- A  F5 ~7 H' ^三:引擎,c语言方面
2 P1 a) l- Y( Z4 l1 W也是同样的观点。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート+ W, L( }* Z, y, f+ n! ^  {
尽量预设开辟一段既定的内存空间,不要试图去在登陆和登出的时候频繁的创建和释放
0 w% q, x/ N* J5 B" j& f# I! a—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート妖城在线论坛  Y8 S# ]6 D! k; d1 V, g0 q
最初妖城启动占用内存大概2.3g,运行大概十天半个月后,就会出现内存溢出,轻则挂端重则回档。
7 j9 ]' _& i# P4 V# @—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート后来优化后(其实没有优化到极致)启动占用内存800m左右,干净的系统top下观察占用内存1g而已
. f0 N$ f9 t8 U% N1 R魔力私服,最新魔力宝贝私服技术交流连续运行几个月都不会有问题。
. w) x+ i$ r6 X, S7 D, q/ W魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表
, B2 |/ b. G$ {2 l3 t( `* q: sbbs.mocwww.com以上说的三个方面
9 o4 j% S) H$ n4 b( p- X—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート两个都是一般的开服的gm自己可以控制优化的,第三个是必须引擎技术商方面优化的。
/ y9 @9 p6 V" Y! H$ u5 w—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート- f) z2 ^3 c4 y/ W$ P: I0 y" M
大家可以试一下
妖城欢迎您!

TOP

补充几点魔力私服,最新魔力宝贝私服技术交流' Q7 _6 r8 ?5 {
1. 关于可用内存,实际上linux上面只有3g,windows下面只有2g
$ @: W7 i& s% s- I; ~+ Rbbs.mocwww.com2. luajit 可用内存是2g,除非 64位+GC64模式魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表2 o( Z8 Z( X, D& s* d. a
2.1. 内存回收,lua 申请的内存看luajit的实现了,默认跟c一样的处理逻辑,但如果是myalloc的话,大概率会有内存泄漏,不过就算是c的内存申请后也不是马上归回系统的。
5 C5 [  K- i+ `( W魔力私服,最新魔力宝贝私服技术交流3. gmsv里面动态申请的数据主要是迷宫,不过引擎的myalloc,大概率会有内存泄漏
1 B; }: U& V. D" w5 h7 M* c; U) dbbs.mocwww.com
; k" d! U' K4 s6 a" y+ u+ [魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表[ 本帖最后由 Muscipular 于 2023-5-15 12:40 编辑 ]

TOP

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

TOP

发新话题