Files
dafuweng-saiadmin6.x/server/docs/PERFORMANCE_AND_QPS_ANALYSIS.md
2026-03-16 09:10:39 +08:00

9.9 KiB
Raw Blame History

歷멩????塋??㎬?訝?QPS ????ε?

訝???????訝?????鰲?

窈밭? 瑥닸?
瓦????? Webman (?뷰? Workerman)竊?만要삣?耶?
HTTP ??? http://0.0.0.0:6688
Worker ?곈? cpu_count() * 4竊?? 8 ??= 32 訝??葉??
?경?佯? MySQL竊?hinkORM竊???ζ? max=20/min=2
煐?? Redis竊?hink-cache 容?? redis竊??瓦??黎?max=20/min=2
煐??要긷?力ⓩ? config/cache.php 容?? file竊??訝??鵝욜?瑥ι?營??煐??壅경?餓띰?config/think-cache.php 容?? redis竊?PI ?ⓩ?/也????쉰嶺?슴??Redis

雅????恙???????黎????

2.1 遙?뭉????녔???

?ε? ?③?? 訝삭???? 窯?섟??????竊??謠??쇽?
POST /api/game/playStart 凉?冶??掠?歷멩?竊??也?? 鸚?? DB + Redis + 雅?? 遙??鰲??竊?
POST /api/game/buyLotteryTickets 兀?물?썲??? 雅?????烏ⓨ???+ Redis ?닸? 訝?
GET /api/game/config 歷멩???쉰 ?②〃 DiceConfig ?θ?竊??煐?? 鵝?訝?
GET /api/game/lotteryPool 也????쉰 DiceRewardConfig 煐?? 鵝?
POST /api/v1/getGameUrl ?룟?歷멩??겼?竊?뭄?곤? ?삣??삭? + JWT + Redis 訝?
POST /api/v1/getPlayerInfo ?⒴?岳→? ??username ??DicePlayer 鵝??兩븃? username ???訝?榮℡?竊?
POST /api/v1/getPlayerGameRecord 歷멩?溫겼???〃 ??〉 + ??? N+1 ?η?若? 訝?
POST /api/v1/setPlayerWallet ?긷?饔??饔?? 雅??竊???곁?若?+ ???麗? 訝?

2.2 playStart ???瑥룡??????㎗竊??㎬??녜?瓮??竊?

???歷멩?訝?轝↑?黎?ㄷ?답?鰲??竊? ?경?佯??

  1. DicePlayer::find($playerId) ???↓??⒴?訝??窯?2. DiceRewardConfig::getCachedMinRealEv() ??腰??????ε?亮뜹?煐??
  2. LotteryService::getOrCreate() ?????訝?Redis ?띰?DicePlayer::find + DiceLotteryPoolConfig::where('type',0/1)->find() 訝ㅶ?
  3. DiceLotteryPoolConfig::find($configId) ?????營?ID ???黎?5. **雅????*竊?
    • DicePlayRecord::create
    • DicePlayer::find($playerId)竊??轝→??⒴?竊??鴉??竊?
    • DicePlayer::save
    • ??? DicePlayerTicketRecord::create竊?5 訝??竊?
    • DiceLotteryPoolConfig::where('id')->update(['ev' => Db::raw(...)]) ??烏?벨?닸?
    • DicePlayerWalletRecord::create
  4. 雅?????DicePlayer::find($playerId)??UserCache::setUser`

*Redis竊?

  • DiceRewardConfig::getCachedInstance()竊?? getCachedByTier 嶺????瑥?????깁?營??耶?- LotteryService::getOrCreate() ??瑥????若뜹?黎??耶?- UserCache::setUser() ??????룝에???耶? ?①?耶??訝??也썹????訝????? playStart 餓?벧??**6節? 轝?DB 溫욥?**竊??雅????2 轝?find ?⒴??? 轝?update 壤⑶?黎???節? 轝?create竊??? ?η?耶???썰릎竊??鴉??????깁?營????黎??營????若띄??θ?轝→???

訝????㎬??띌?訝???⑴?

3.1 ?경?佯?

  1. *瓦??黎?? Worker ??
    • ??? DB 瓦??黎?max=20竊?orker ??= CPU?4??? 32 訝?Worker ?????빨竊??雅?? 20 訝???ο??븀?嶺??訝???뜰??
    • 兩븃?竊??????? DB_POOL_MAX竊?? 32節?4竊??亮띄???MySQL max_connections 訝???θ???
  2. playStart ???鸚???⒴?
    • 雅??鸚?럴 DicePlayer::find($playerId)竊???▼???DicePlayer::find($playerId)??
    • ???訝뷴?雅?????????ⓨ럴??$player ????ε?誤??餘듸????訝?轝?SELECT??
  3. DiceLotteryPoolConfig::where('id', $configId)->update(['ev' => Db::raw(...)])
    • 驪???썸??겼?訝???쉰烏?? ev竊??亮뜹?訝??烏??塋?????竊???썸?訝븀?窯???
    • ?????竊??閭η눕??????띌?/轝→??백??닸?竊??鵝욜? Redis 溫→?????뜹?閭ε? DB??
  4. 榮℡?
    • dice_player.username??dice_play_record.player_id??dice_play_record.create_time?? dice_player_wallet_record.player_id??dice_player_ticket_record.player_id` 嶺????뻠榮℡?竊??烏ⓧ?瀯??鴉??????
    • 兩븃??녑?竊?username ???榮℡?竊?player_id + create_time 瀯??榮℡?竊??若???θ??▽뻑孃??竊???

3.2 煐??

  1. *煐??要긷?訝????
    • config/cache.php 容?? file竊??訝?????瑥ι?營?? Cache竊??壅경?餓띰?QPS 遙?? I/O ???鴉??訝븀?窯???
    • 兩븃?竊??雅㎫?訝?鵝욜? Redis竊?뭉簾?? CACHE_MODE=redis 訝?think-cache ??default 訝??담??
  2. 也????쉰煐??
    • DiceRewardConfig::getCachedInstance() 藥꿨???????????+ Redis竊??訝???뜻?㎬?也썬??
    • ??岳????쉰????띈???refreshCache()竊?????????룡???
  3. *UserCache ??㎗野?
    • 驪?? getUser/setUser ??AES ??㎗野??遙?QPS 訝?CPU 鴉?????鵝???만訝??腰???띌?竊???????? CPU 遙?????????↓???섄??value??

3.3 ??〃?ε? N+1

  • getPlayerGameRecord竊????〉??DicePlayRecord竊?? whereIn('id', $playerIds) ?η?若뜹뭉瀯???? 壤??若??藥꿨??백??η?若띰?訝???멨? N+1竊???ε?窈?limit 孃?ㄷ餓????????恙??耶???????limit 訝??竊?럴??100 訝??竊???
  • getPlayerWalletRecord / getPlayerTicketRecord 鵝욜? with(['dicePlayer']) 窯??饔쏙??????

3.4 瓦??訝????

  • Worker ??= CPU?4 ?띰??ζ?訝??黎????1 訝?DB 瓦??訝??黎???닻?竊?0 訝???ζ?熬??譯▲??
  • 兩븃?竊?????訝??野?DB_POOL_WAIT_TIMEOUT ???瀯?만鰲??竊???녑????罌?ㄷ黎????????雅????

????PS 窯?섟竊??謠??쇽???????▼?竊?

4.1 ????▽뻑

  • 8 ??CPU竊?2 訝?Worker??- MySQL/Redis ??????兩띈????竊??髥???띌???- 煐???썰릎???竊???깁?營???otteryService??serCache 鸚?맏?썰릎竊???

4.2 ?????嶸?

  • playStart竊??轝←벧 50節?50 ms竊??雅??訝??轝?DB/Redis竊????Worker 瀛?7節?0 QPS竊?2 Worker 瀛?220節?40 QPS?? 若????DB 烏??竊?? dice_lottery_config.ev ?닸?竊?????ζ?嶺??壤긷?竊?岳??鴉계???? 200節?00 QPS*??- buyLotteryTickets竊??轝←벧 20節?0 ms竊???븀벧 500節?000+ QPS竊?빳瓦??黎?????譯▽맏???竊???- **getGameUrl / 亮녑??ε?**竊??壅??壤?? DB ?θ?竊??轝←벧 30節?0 ms竊???븀벧 400節?00 QPS竊?????壅곁?耶????

4.3 曆룟?役??

??70% 訝?playStart??0% 訝뷴?餓?????답???? QPS 鴉?? playStart ?얏?竊?瀯쇔????瀛?250節?00 QPS* ???訝뷴?????담?? 若??????ab/wrk/k6 嶺?? playStart ??말誤????役??瀯?? MySQL ?€?瑥???edis ?썰릎??????ζ?嶺??轝→????????

雅??????뻠溫????

映삣? 兩븃?
??쉰 ??벨溫양쉰 CACHE_MODE=redis竊?뭉瀯??鵝욜? Redis 鵝?맏 Cache 要긷?
瓦??黎? ??? DB_POOL_MAX竊?? 32節?4竊??岳?? ??Worker ?곤?亮띄???MySQL max_connections
餓g? playStart 雅??????ⓨ럴?η? $player竊?????轝?DicePlayer::find($playerId)
?경?佯? 訝?username??player_id??create_time 嶺??窯??瑥℡?餘드?榮℡??????뇨凉?
????닸? dice_lottery_config.ev ???掠??닸??밥맏 Redis 榮?? + 若??/?백???? DB竊??鵝?????雅?
??? 野?playStart??buyLotteryTickets??setPlayerWallet ?????訝??瑥?????竊?뭉??MySQL ?€?瑥??瓦??黎??孃????
??? 鵝욜? ab/wrk/k6 野?/api/game/playStart 嶺???뜻????竊???겼???P99 兩띈?訝??鸚?QPS

?????鵝???곁?若?QPS 訝?P99

  1. ??? playStart
    • 鵝욜???? JWT竊??????삣??욕? token竊??野?POST /api/game/playStart ??body direction=0 ??1??
    • 鹽뷰?竊???욘? URL ??token竊??
      # 鵝욜? ab
      ab -n 1000 -c 32 -p post_body.json -T application/json -H "token: YOUR_JWT" http://127.0.0.1:6688/api/game/playStart
      
      # 鵝욜? wrk竊?? lua ???鴉?token ??body竊?     wrk -t4 -c32 -d30s -s play_start.lua http://127.0.0.1:6688/api/game/playStart
      
    • 餓????릎孃?? Requests per second竊?PS竊?? Time per request竊???®? P99 ?ε램?룡??????
  2. ??????
    • 佯??竊??訝????瑥룡?????뭄?? P99 ?????xx 訝???뜻??겹??
    • MySQL竊???ζ?????θ???nnoDB 烏??嶺????
    • Redis竊???ζ????訝?????餓ㅸ?????
  3. ?띌??ㅶ?
    • ??QPS 訝????CPU ???譯???鴉?????餓g?????뷴???
    • ??DB 瓦??嶺??????θ?罌?? ????뇨凉?????????瓦??黎???????〃??
    • ??Redis 兩띈?訝?? ???εㄷ key????썰빱???瀯??瓦??黎???

訝????鵝??遙??㎬?竊????????

??*???雅㎩?驪?*餓???겻????竊????????窈밧?????얏???QPS 訝?㉢若??㎯??

7.1 ??쉰掠???백?營???????빰??????

鴉??瀛? ??? 瑥닸?
遙? ??벨???溫양쉰 CACHE_MODE=redis ?욕?壅경?餓띄?耶????? I/O 訝??塋??竊?? think-cache 岳??訝??담??
遙? ??? DB 瓦??黎??DB_POOL_MAX=32 ??64 岳?? ??Worker ?곤?倻?32竊???욕?遙?뭉???瓦??嶺??訝???뜰??
訝? ??? Redis 瓦??黎??REDIS_POOL_MAX=32 訝?Worker ?겼??????? Redis ?룟?瓦??嶺????
訝? 簾?? MySQL max_connections ??佯??瓦??黎??삣? 鸚??堊??營꿩?竊??堊?? ? DB_POOL_MAX ?욤?瓦?MySQL 訝????

*鹽뷰? .env ???竊?

CACHE_MODE=redis
DB_POOL_MAX=32
DB_POOL_MIN=4
REDIS_POOL_MAX=32

7.2 ?경?佯??竊??榮℡???????

鴉??瀛? ??? 瑥닸?
遙? 訝?dice_player.username 兩뷴?訝?榮℡? ?삣???etPlayerInfo??oken 訝??餓뜹???username ?ο???뇨凉???②〃?????
遙? 訝?dice_play_record(player_id, create_time) 兩븀???뇨凉? 歷멩?溫겼???〃???溫→??⒴?+?띌??θ?竊?????窈듕?瀯????
訝? 訝뷸?麗닺〃 player_id??create_time` 兩븀뇨凉? 倻?dice_player_wallet_record??dice_player_ticket_record` ???若뜻??띌?嶺?????ⓨ?訝???

鹽뷰? SQL竊??若??烏ⓨ?瘟??竊??

-- ?ε?????ⓨ?曆삣?
ALTER TABLE dice_player ADD UNIQUE INDEX uk_username (username);
ALTER TABLE dice_play_record ADD INDEX idx_player_create (player_id, create_time);
ALTER TABLE dice_player_wallet_record ADD INDEX idx_player_create (player_id, create_time);
ALTER TABLE dice_player_ticket_record ADD INDEX idx_player_create (player_id, create_time);

7.3 餓g?掠????? DB 瘟??訝???백?竊?

鴉??瀛? ??? 瑥닸?
遙? playStart 雅??????ⓨ럴?η? $player竊????DicePlayer::find($playerId) 弱?1 轝?SELECT竊???▼??ⓨ?訝? $player ???耶????? 1 轝?SELECT??
訝? game/config ?ε?訝?DiceConfig ???耶? ??쉰???窯??鵝????Redis 煐?? 1節? ???竊??弱??烏ⓩ?瑥???
訝? dice_lottery_config.ev ?밥맏 Redis 榮?? + 若????? DB 驪??訝?? UPDATE dice_lottery_config SET ev=ev-?竊?????烏???백?竊??驪?????驪?N 掠????訝?轝▲??

7.4 ???訝????

鴉??瀛? ??? 瑥닸?
訝? 野?playStart??buyLotteryTickets` ?????訝??瑥????? 堊요?????<3F>?黎??凉?만役????
訝? 凉???MySQL ?€?瑥€?恙??倻?>200ms竊? 若??????뇨凉??鴉????SQL??
鵝? ???孃????? QPS 訝?P99 ??ab/wrk/k6 野?playStart ???竊?빳?경?若??????⒴??뜻???

7.5 窯?????竊??謠??쇽?

  • ??쉰掠?+ 榮℡?竊???δ????訝븀?窯????〃訝??壤?????얍?恙???답??????벧 20%節?0% ??? QPS??- ?삥? playStart ??2 轝▼?鵝??佯?????黎?? 2 轝?round-trip竊?*playStart ???黎????瀛?? 5%節?5%**??- ev ?밥맏 Redis 榮??竊??亮뜹?訝?playStart 烏??塋??訝??竊????playStart QPS ????????**10%節?0%**竊??亮뜹?佯????竊???

**瑥닸?**竊??瓦?QPS 訝??????맏?뷰?餓g?訝??營??鴉곁?竊?????㎬?餓ε?役??瀛요????訝뷴???뻠溫??窯??/??벨??????弱??饔?playStart 訝??壤????????녔????????