ÉÏһƪ½â¾öÁËÈçºÎ“°Ñ·þ¼ÜÆðÀ´”£¬Õâ´Î½ÌÄãÈçºÎ“È÷þÎȶ¨ÅÜÏÂÈ¥”£¡Ãæ¶Ô¿¨¶Ù¡¢µôÏß¡¢ÈëÇÖ¡¢°æ±¾¸üеÈÒÉÄÑÔÓÖ¢£¿Õâ·ÝÔËάʵս±¦µä¸øÄã´ð°¸£¡
🛡️ µÚÒ»²¿·Ö£º·þÎñÆ÷ÐÔÄÜÆ¿¾±ÅŲéÓëÓÅ»¯
📈 1. ʵʱ¼à¿Ø¹Ø¼üÖ¸±ê
±Ø±¸¹¤¾ß£ºtop (CPU/Mem), iftop (ÍøÂçÁ÷Á¿), iotop (´ÅÅÌIO), glances (×ÛºÏ)
ÖØµã¹Ø×¢£º
CPU ʹÓÃÂʳÖÐø > 80% (ÓÈÆägs½ø³Ì)
ÄÚ´æ Swap ʹÓÃÂÊ > 20%
ÍøÂç´ø¿íÕ¼Âú (>80%)
´ÅÅÌ IO Wait > 20%
🧩 2. ÓÎÏ··þÎñÆ÷½ø³Ì (gs) ¸ß¸ºÔØÓÅ»¯
Ïß³ÌÊýµ÷Õû (Ðè¸ù¾ÝCPUºËÐÄÊý)£º
# /home/pwserver/gamed/config.ini
[THREAD]
WorldThreadNumber = 16 # ÍÆ¼ö = CPUÎïÀíºËÐÄÊý*2
µØÍ¼·ÖÏß¹ÜÀí£º
ѹÁ¦´óµÄÈÈÃŵØÍ¼£¨Èç׿Áú³Ç¡¢¸±±¾Èë¿Ú£©µ¥¶À·ÖÏ߯ô¶¯
cd /home/pwserver/gamed
./gs gs.conf gmserver.conf gsaliasXX.conf # Æô¶¯XXÏß
ÄÚ´æÐ¹Â¶Õï¶Ï£º
# ʹÓÃvalgrind¼ì²âgs½ø³Ì (ÐÔÄÜ¿ªÏú´ó£¬²âÊÔ·þʹÓÃ)
valgrind --leak-check=full ./gs gs.conf
¶¨ÆÚÖØÆôµ÷¶È£ºÊ¹Óà cron ÿÌìµÍ·åʱ¶ÎÖØÆô·þÎñ½ø³Ì
🛡️ µÚ¶þ²¿·Ö£ºµÖÓùÈëÇÖ & °²È«¹ÜÀí
🔒 1. ±Ø×öµÄ°²È«¼Ó¹Ì
ɾ³ý/½ûÓÃĬÈÏÕ˺ţº
userdel -r test # ɾ³ý³£¼û²âÊÔÕ˺Å
passwd -l root # Ëø¶¨rootÔ¶³ÌµÇ¼ (ÍÆ¼öÓÃsudoȨÏÞÓû§)
Ð޸ķþÎñĬÈÏ¶Ë¿Ú (ÖØµã£¡)£º
# authd.conf
port = 32987 # ÐÞ¸ÄĬÈÏ146¶Ë¿ÚÎªËæ»ú¸ßλ¶Ë¿Ú
# gs.conf
baseport = 29000 # ÐÞ¸ÄĬÈÏ29000Æðʼ¶Ë¿Ú¶Î
·À»ðǽ (firewalld/iptables) Ñϸñ²ßÂÔ£º
# Ö»¿ª·Å±ØÐè¶Ë¿Ú (SSH, authd¶Ë¿Ú, gs¶Ë¿Ú¶Î)
firewall-cmd --permanent --add-port=32987/tcp
firewall-cmd --permanent --add-port=29000-29100/tcp
firewall-cmd --reload
🕵️ 2. ·ÀÆÆ½âÓëɨºÅ¹¥»÷
ÆÁ±ÎɨÃèIP¹¤¾ß (Fail2Ban)£º
# °²×°Fail2Ban
yum install epel-release -y
yum install fail2ban -y
# ÅäÖñ£»¤SSHºÍÓÎÏ·¶Ë¿Ú
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
# ±à¼jail.local£¬ÔÚ¶ÔӦģ¿éÉèÖãº
maxretry = 3 # ʧ°Ü´ÎÊý
bantime = 86400 # ·â½ûʱ¼ä(Ãë)
Êý¾Ý¿â·ÃÎÊÏÞÖÆ£º
-- ½ûÖ¹MySQLÍâÍø·ÃÎÊ (ÈçÎÞÍⲿ¹ÜÀíÐèÇó)
DELETE FROM mysql.user WHERE Host NOT IN ('localhost', '127.0.0.1');
FLUSH PRIVILEGES;
🧩 µÚÈý²¿·Ö£ºÎå´ó¸ßƵ±ÀÀ£ÎÊÌâ¼±¾È
🆘 ±ÀÀ£1£ºÍæ¼Ò¾Û¼¯Ê±µØÍ¼gs˲¼äå´»ú
ÔÒò£º´óÁ¿Íæ¼Ò¼¼ÄÜ/ÌØÐ§Òý·¢¶ÑÕ»Òç³ö
½â¾ö£º
Ôö´ó½ø³ÌÕ»¿Õ¼ä (ÔÚÆô¶¯½Å±¾start.shÖÐÐÞ¸Ä)
ulimit -s unlimited # ÉèÖÃÕ»´óСÎÞÏÞÖÆ
./gs gs.conf ... # È»ºóÆô¶¯gs
🆘 ±ÀÀ£2£º¸±±¾¿ªÆôºóÌáʾ"µØÍ¼¼ÓÔØÊ§°Ü"
Õï¶Ï£º¼ì²é /home/pwserver/gamed/log/gameXX.log
½â¾ö£º
È·ÈϵØÍ¼Îļþ map/¸±±¾Ãû.map ´æÔÚÇÒȨÏÞÕýÈ·
¼ì²é¸±±¾ÅäÖñí tasks.data ÊÇ·ñ¶ÔÓ¦
ÖÕ¼«·½°¸£º¸´ÖƱ¸·ÝµÄÔʼµØÍ¼Îļþ¸²¸ÇÎÊÌ⸱±¾
🆘 ±ÀÀ£3£ºÊ¹ÓÃÌØ¶¨ÎïÆ·/×øÆïµ¼Ö¿ͻ§¶ËÉÁÍË
¶¨Î»£º100%Êǿͻ§¶Ë²¹¶¡Óë·þÎñ¶Ë°æ±¾²»Æ¥Åä
·½°¸£º
ÌáÈ¡·þÎñ¶Ë /home/pwserver/config/ ϶ÔÓ¦µÄ elements.data, tasks.data µÈ
ÑϸñʹÓ÷þÎñ¶Ë×Ô´øÅäÌ׿ͻ§¶Ë²¹¶¡¸²¸ÇÍæ¼Ò¿Í»§¶Ë
½ûÖ¹»ìÓò»Í¬À´Ô´²¹¶¡£¡
🆘 ±ÀÀ£4£ºÊý¾Ý¿â±íËð»µÒý·¢·þÎñÍ£°Ú
ÏÖÏó£ºÆô¶¯Ê±Ìáʾ "Table marked as crashed"
¼±¾È£º
Í£·þÐÞ¸´
systemctl stop mysqld
myisamchk -r /var/lib/mysql/pwdb/*.MYI
myisamchk --safe-recover /var/lib/mysql/pwdb/*.MYI
systemctl start mysqld
Ö®ºóÁ¢¼´½øÐÐÊý¾Ý¿âÍêÕû±¸·Ý£¡
🆘 ±ÀÀ£5£ºÄÚ´æºÄ¾¡µ¼ÖÂLinux OOM KillerÖÕÖ¹½ø³Ì
Ô¤·À£º
¼à¿ØÄڴ棺ÉèÖà cron ÈÎÎñ¼ì²âÄÚ´æÊ¹Ó㬳¬ãÐÖµ×Ô¶¯ÖØÆô
¹Ø¼üÅäÖ㺵÷ÕûLinux OOM²ßÂÔ£¬ÓÅÏȱ£»¤gs½ø³Ì
echo '-800' > /proc/$(pidof gs)/oom_score_adj
🔄 µÚËIJ¿·Ö£º°æ±¾¸üÐÂÓëÊý¾ÝÇ¨ÒÆÖ¸ÄÏ
⚙️ °²È«¸üÐÂÁ÷³Ì£º
²âÊÔ·þÑéÖ¤£ºÐ·þÎñ¶ËÎļþÔÚ²âÊÔ»·¾³ÍêÕûÔËÐÐ24Сʱ
Íæ¼Ò¹«¸æ£ºÌáǰ72Сʱ¹«¸æÎ¬»¤Ê±¼ä
¹Ø¼ü²½Ö裺
# 1. ÍêÕû±¸·ÝÊý¾Ý¿âºÍ·þÎñ¶ËĿ¼
mysqldump -u root -p --opt pwdb > pwdb_bak_$(date +%F).sql
tar -zcf /backup/pwserver_full_$(date +%F).tar.gz /home/pwserver
# 2. Í£Ö¹·þÎñ
cd /home/pwserver && ./stop.sh
# 3. ÓÃаæÎļþÌæ»» (×¢Òâ±£ÁôÍæ¼ÒÊý¾ÝÅäÖÃĿ¼!)
cp -r /patch/gamed /home/pwserver/ # ¸²¸Ç¶þ½øÖƺÍÅäÖÃ
# ÇÐÎð¸²¸Ç log/, userdata/ µÈĿ¼£¡
# 4. Ö´ÐÐÉý¼¶SQL½Å±¾ (ÈçÓÐ)
mysql -u root -p pwdb < /patch/update.sql
# 5. Æô¶¯·þÎñ²¢ÃÜÇÐ¼à¿ØÈÕÖ¾
./start.sh && tail -f logs/*.log
⚠️ ·¨ÂÉÓë·çÏÕÔÙÌáʾ
🔐 ÔËÓªÕßÐëÖªºËÐÄÈýÌõ£º
¼¼ÊõѧϰÎÞ·Á£¬ÉÌÒµÔËÓª±Ø¾¿£º´úÂë·ÖÎöÊDZ¦¹óµÄ±à³Ìʵ¼ù£¬µ«Éæ¼°³äÖµ¡¢»áÔ±¼´²È·¨ÂɺìÏß
Íæ¼ÒÊý¾Ý¼´µØÀ×£ºÎñ±Ø¼ÓÃÜ´æ´¢ÃÜÂ룬¶¨ÆÚɾ³ýÈßÓàÈÕÖ¾¡£Êý¾Ýй¶µÄ·¨ÂÉÔðÈÎÔ¶±ÈÄãÏëÏóµÄÑÏÖØ
·Ö²¼Ê½²¿Êð¸üÒþ±Îµ«·çÏÕδ¼õ£º½«DBÓëGS·ÖÀëÔÚ²»Í¬·þÎñÆ÷ÎÞ·¨¹æ±Ü°æÈ¨×·Ôð
🧰 ¸½Â¼£ºÔËάÉñÆ÷¹¤¾ß°ü (×ÔÈ¡)
ÈÕÖ¾·ÖÎöÆ÷£ºELK Stack (´¦Àíº£Á¿ÓÎÏ·ÈÕÖ¾)
½ø³ÌÊØ»¤£ºSupervisor (±ÀÀ£×Ô¶¯ÖØÆôgs/authd)
ÐÔÄÜѹ²â£ºLocust (Ä£ÄâǧÃûÍæ¼ÒÔÚÏß)
Êý¾Ý¿â¹ÜÀí£ºAdminer (ÇáÁ¿¼¶Web°æphpMyAdmin)
±¸·Ýͬ²½£ºrsync + crontab (ÉèÖÃÿÈÕÁ賿×Ô¶¯±¸·Ý)
💎 »Æ½ð½¨Ò飺½¨Á¢Íæ¼Ò²âÊÔȺ£¡ºËÐÄÍæ¼ÒȺÊÇ×î¸ßЧµÄÃâ·Ñ²âÊÔÍŶӡ£Ã¿´Î¸üÐÂǰ·¢²¼ÌåÑé°ü£¬ÖØ´óBUGÌáǰÀ¹½Ø£¬´ó·ùÌáÉý·þÎñÆ÷Îȶ¨ÐÔ¿Ú±®¡£
🛡️ µÚÒ»²¿·Ö£º·þÎñÆ÷ÐÔÄÜÆ¿¾±ÅŲéÓëÓÅ»¯
📈 1. ʵʱ¼à¿Ø¹Ø¼üÖ¸±ê
±Ø±¸¹¤¾ß£ºtop (CPU/Mem), iftop (ÍøÂçÁ÷Á¿), iotop (´ÅÅÌIO), glances (×ÛºÏ)
ÖØµã¹Ø×¢£º
CPU ʹÓÃÂʳÖÐø > 80% (ÓÈÆägs½ø³Ì)
ÄÚ´æ Swap ʹÓÃÂÊ > 20%
ÍøÂç´ø¿íÕ¼Âú (>80%)
´ÅÅÌ IO Wait > 20%
🧩 2. ÓÎÏ··þÎñÆ÷½ø³Ì (gs) ¸ß¸ºÔØÓÅ»¯
Ïß³ÌÊýµ÷Õû (Ðè¸ù¾ÝCPUºËÐÄÊý)£º
# /home/pwserver/gamed/config.ini
[THREAD]
WorldThreadNumber = 16 # ÍÆ¼ö = CPUÎïÀíºËÐÄÊý*2
µØÍ¼·ÖÏß¹ÜÀí£º
ѹÁ¦´óµÄÈÈÃŵØÍ¼£¨Èç׿Áú³Ç¡¢¸±±¾Èë¿Ú£©µ¥¶À·ÖÏ߯ô¶¯
cd /home/pwserver/gamed
./gs gs.conf gmserver.conf gsaliasXX.conf # Æô¶¯XXÏß
ÄÚ´æÐ¹Â¶Õï¶Ï£º
# ʹÓÃvalgrind¼ì²âgs½ø³Ì (ÐÔÄÜ¿ªÏú´ó£¬²âÊÔ·þʹÓÃ)
valgrind --leak-check=full ./gs gs.conf
¶¨ÆÚÖØÆôµ÷¶È£ºÊ¹Óà cron ÿÌìµÍ·åʱ¶ÎÖØÆô·þÎñ½ø³Ì
🛡️ µÚ¶þ²¿·Ö£ºµÖÓùÈëÇÖ & °²È«¹ÜÀí
🔒 1. ±Ø×öµÄ°²È«¼Ó¹Ì
ɾ³ý/½ûÓÃĬÈÏÕ˺ţº
userdel -r test # ɾ³ý³£¼û²âÊÔÕ˺Å
passwd -l root # Ëø¶¨rootÔ¶³ÌµÇ¼ (ÍÆ¼öÓÃsudoȨÏÞÓû§)
Ð޸ķþÎñĬÈÏ¶Ë¿Ú (ÖØµã£¡)£º
# authd.conf
port = 32987 # ÐÞ¸ÄĬÈÏ146¶Ë¿ÚÎªËæ»ú¸ßλ¶Ë¿Ú
# gs.conf
baseport = 29000 # ÐÞ¸ÄĬÈÏ29000Æðʼ¶Ë¿Ú¶Î
·À»ðǽ (firewalld/iptables) Ñϸñ²ßÂÔ£º
# Ö»¿ª·Å±ØÐè¶Ë¿Ú (SSH, authd¶Ë¿Ú, gs¶Ë¿Ú¶Î)
firewall-cmd --permanent --add-port=32987/tcp
firewall-cmd --permanent --add-port=29000-29100/tcp
firewall-cmd --reload
🕵️ 2. ·ÀÆÆ½âÓëɨºÅ¹¥»÷
ÆÁ±ÎɨÃèIP¹¤¾ß (Fail2Ban)£º
# °²×°Fail2Ban
yum install epel-release -y
yum install fail2ban -y
# ÅäÖñ£»¤SSHºÍÓÎÏ·¶Ë¿Ú
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
# ±à¼jail.local£¬ÔÚ¶ÔӦģ¿éÉèÖãº
maxretry = 3 # ʧ°Ü´ÎÊý
bantime = 86400 # ·â½ûʱ¼ä(Ãë)
Êý¾Ý¿â·ÃÎÊÏÞÖÆ£º
-- ½ûÖ¹MySQLÍâÍø·ÃÎÊ (ÈçÎÞÍⲿ¹ÜÀíÐèÇó)
DELETE FROM mysql.user WHERE Host NOT IN ('localhost', '127.0.0.1');
FLUSH PRIVILEGES;
🧩 µÚÈý²¿·Ö£ºÎå´ó¸ßƵ±ÀÀ£ÎÊÌâ¼±¾È
🆘 ±ÀÀ£1£ºÍæ¼Ò¾Û¼¯Ê±µØÍ¼gs˲¼äå´»ú
ÔÒò£º´óÁ¿Íæ¼Ò¼¼ÄÜ/ÌØÐ§Òý·¢¶ÑÕ»Òç³ö
½â¾ö£º
Ôö´ó½ø³ÌÕ»¿Õ¼ä (ÔÚÆô¶¯½Å±¾start.shÖÐÐÞ¸Ä)
ulimit -s unlimited # ÉèÖÃÕ»´óСÎÞÏÞÖÆ
./gs gs.conf ... # È»ºóÆô¶¯gs
🆘 ±ÀÀ£2£º¸±±¾¿ªÆôºóÌáʾ"µØÍ¼¼ÓÔØÊ§°Ü"
Õï¶Ï£º¼ì²é /home/pwserver/gamed/log/gameXX.log
½â¾ö£º
È·ÈϵØÍ¼Îļþ map/¸±±¾Ãû.map ´æÔÚÇÒȨÏÞÕýÈ·
¼ì²é¸±±¾ÅäÖñí tasks.data ÊÇ·ñ¶ÔÓ¦
ÖÕ¼«·½°¸£º¸´ÖƱ¸·ÝµÄÔʼµØÍ¼Îļþ¸²¸ÇÎÊÌ⸱±¾
🆘 ±ÀÀ£3£ºÊ¹ÓÃÌØ¶¨ÎïÆ·/×øÆïµ¼Ö¿ͻ§¶ËÉÁÍË
¶¨Î»£º100%Êǿͻ§¶Ë²¹¶¡Óë·þÎñ¶Ë°æ±¾²»Æ¥Åä
·½°¸£º
ÌáÈ¡·þÎñ¶Ë /home/pwserver/config/ ϶ÔÓ¦µÄ elements.data, tasks.data µÈ
ÑϸñʹÓ÷þÎñ¶Ë×Ô´øÅäÌ׿ͻ§¶Ë²¹¶¡¸²¸ÇÍæ¼Ò¿Í»§¶Ë
½ûÖ¹»ìÓò»Í¬À´Ô´²¹¶¡£¡
🆘 ±ÀÀ£4£ºÊý¾Ý¿â±íËð»µÒý·¢·þÎñÍ£°Ú
ÏÖÏó£ºÆô¶¯Ê±Ìáʾ "Table marked as crashed"
¼±¾È£º
Í£·þÐÞ¸´
systemctl stop mysqld
myisamchk -r /var/lib/mysql/pwdb/*.MYI
myisamchk --safe-recover /var/lib/mysql/pwdb/*.MYI
systemctl start mysqld
Ö®ºóÁ¢¼´½øÐÐÊý¾Ý¿âÍêÕû±¸·Ý£¡
🆘 ±ÀÀ£5£ºÄÚ´æºÄ¾¡µ¼ÖÂLinux OOM KillerÖÕÖ¹½ø³Ì
Ô¤·À£º
¼à¿ØÄڴ棺ÉèÖà cron ÈÎÎñ¼ì²âÄÚ´æÊ¹Ó㬳¬ãÐÖµ×Ô¶¯ÖØÆô
¹Ø¼üÅäÖ㺵÷ÕûLinux OOM²ßÂÔ£¬ÓÅÏȱ£»¤gs½ø³Ì
echo '-800' > /proc/$(pidof gs)/oom_score_adj
🔄 µÚËIJ¿·Ö£º°æ±¾¸üÐÂÓëÊý¾ÝÇ¨ÒÆÖ¸ÄÏ
⚙️ °²È«¸üÐÂÁ÷³Ì£º
²âÊÔ·þÑéÖ¤£ºÐ·þÎñ¶ËÎļþÔÚ²âÊÔ»·¾³ÍêÕûÔËÐÐ24Сʱ
Íæ¼Ò¹«¸æ£ºÌáǰ72Сʱ¹«¸æÎ¬»¤Ê±¼ä
¹Ø¼ü²½Ö裺
# 1. ÍêÕû±¸·ÝÊý¾Ý¿âºÍ·þÎñ¶ËĿ¼
mysqldump -u root -p --opt pwdb > pwdb_bak_$(date +%F).sql
tar -zcf /backup/pwserver_full_$(date +%F).tar.gz /home/pwserver
# 2. Í£Ö¹·þÎñ
cd /home/pwserver && ./stop.sh
# 3. ÓÃаæÎļþÌæ»» (×¢Òâ±£ÁôÍæ¼ÒÊý¾ÝÅäÖÃĿ¼!)
cp -r /patch/gamed /home/pwserver/ # ¸²¸Ç¶þ½øÖƺÍÅäÖÃ
# ÇÐÎð¸²¸Ç log/, userdata/ µÈĿ¼£¡
# 4. Ö´ÐÐÉý¼¶SQL½Å±¾ (ÈçÓÐ)
mysql -u root -p pwdb < /patch/update.sql
# 5. Æô¶¯·þÎñ²¢ÃÜÇÐ¼à¿ØÈÕÖ¾
./start.sh && tail -f logs/*.log
⚠️ ·¨ÂÉÓë·çÏÕÔÙÌáʾ
🔐 ÔËÓªÕßÐëÖªºËÐÄÈýÌõ£º
¼¼ÊõѧϰÎÞ·Á£¬ÉÌÒµÔËÓª±Ø¾¿£º´úÂë·ÖÎöÊDZ¦¹óµÄ±à³Ìʵ¼ù£¬µ«Éæ¼°³äÖµ¡¢»áÔ±¼´²È·¨ÂɺìÏß
Íæ¼ÒÊý¾Ý¼´µØÀ×£ºÎñ±Ø¼ÓÃÜ´æ´¢ÃÜÂ룬¶¨ÆÚɾ³ýÈßÓàÈÕÖ¾¡£Êý¾Ýй¶µÄ·¨ÂÉÔðÈÎÔ¶±ÈÄãÏëÏóµÄÑÏÖØ
·Ö²¼Ê½²¿Êð¸üÒþ±Îµ«·çÏÕδ¼õ£º½«DBÓëGS·ÖÀëÔÚ²»Í¬·þÎñÆ÷ÎÞ·¨¹æ±Ü°æÈ¨×·Ôð
🧰 ¸½Â¼£ºÔËάÉñÆ÷¹¤¾ß°ü (×ÔÈ¡)
ÈÕÖ¾·ÖÎöÆ÷£ºELK Stack (´¦Àíº£Á¿ÓÎÏ·ÈÕÖ¾)
½ø³ÌÊØ»¤£ºSupervisor (±ÀÀ£×Ô¶¯ÖØÆôgs/authd)
ÐÔÄÜѹ²â£ºLocust (Ä£ÄâǧÃûÍæ¼ÒÔÚÏß)
Êý¾Ý¿â¹ÜÀí£ºAdminer (ÇáÁ¿¼¶Web°æphpMyAdmin)
±¸·Ýͬ²½£ºrsync + crontab (ÉèÖÃÿÈÕÁ賿×Ô¶¯±¸·Ý)
💎 »Æ½ð½¨Ò飺½¨Á¢Íæ¼Ò²âÊÔȺ£¡ºËÐÄÍæ¼ÒȺÊÇ×î¸ßЧµÄÃâ·Ñ²âÊÔÍŶӡ£Ã¿´Î¸üÐÂǰ·¢²¼ÌåÑé°ü£¬ÖØ´óBUGÌáǰÀ¹½Ø£¬´ó·ùÌáÉý·þÎñÆ÷Îȶ¨ÐÔ¿Ú±®¡£

