From 1c010e9b5f00abfb02d2de87d7a856d88514309b Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 1 Jun 2020 19:15:55 +0800 Subject: [PATCH] add perfmonitor --- server/gameserver/android.cc | 4 +-- server/gameserver/app.cc | 51 ++++++++++++++++++-------------- server/gameserver/app.h | 1 - server/gameserver/building.cc | 5 ++-- server/gameserver/bullet.cc | 5 ++-- server/gameserver/entity.cc | 3 +- server/gameserver/handlermgr.cc | 7 +++-- server/gameserver/loot.cc | 5 ++-- server/gameserver/obstacle.cc | 5 ++-- server/gameserver/perfmonitor.cc | 13 ++++++++ server/gameserver/perfmonitor.h | 26 ++++++++++++++++ server/gameserver/player.cc | 7 +++-- server/gameserver/playermgr.cc | 47 +++++++++++++++++++++++++++++ server/gameserver/playermgr.h | 4 +++ server/gameserver/room.cc | 11 +++---- server/gameserver/roommgr.cc | 14 +++++---- server/gameserver/types.h | 16 ---------- 17 files changed, 159 insertions(+), 65 deletions(-) create mode 100644 server/gameserver/perfmonitor.cc create mode 100644 server/gameserver/perfmonitor.h diff --git a/server/gameserver/android.cc b/server/gameserver/android.cc index e27c9b7..220c7fd 100644 --- a/server/gameserver/android.cc +++ b/server/gameserver/android.cc @@ -11,7 +11,7 @@ Android::Android():Human() ai = new AndroidAI; ai->owner = this; #if 0 - ++App::Instance()->perf.entity_num[ET_Android]; + ++PerfMonitor::Instance()->entity_num[ET_Android]; #endif } @@ -20,7 +20,7 @@ Android::~Android() delete ai; ai = nullptr; #if 0 - --App::Instance()->perf.entity_num[ET_Android]; + --PerfMonitor::Instance()->entity_num[ET_Android]; #endif } diff --git a/server/gameserver/app.cc b/server/gameserver/app.cc index bb585fe..ddbfa8b 100755 --- a/server/gameserver/app.cc +++ b/server/gameserver/app.cc @@ -22,6 +22,7 @@ #include "playermgr.h" #include "mapmgr.h" #include "entityfactory.h" +#include "perfmonitor.h" #include "ss_msgid.pb.h" #include "ss_proto.pb.h" @@ -56,31 +57,35 @@ const char* const PROJ_LOG_FILENAME_FMT = "log_$pid_%Y%m%d.log"; static void SavePerfLog() { a8::UdpLog::Instance()->Info - ("mainloop_rundelay:%d room_num:%d player_num:%d online_num:%d alive_count:%d " - "sys_request_delay:%d user_request_delay:%d http_pending_num:%d real_alive_count:%d", + ("rundelay:%d room_num:%d player_num:%d online_num:%d alive_count:%d " + "sys_request_delay:%d user_request_delay:%d http_pending_num:%d real_alive_count:%d " + "account_num:%d level0_num:%d level1_num:%d", { - App::Instance()->perf.max_run_delay_time, + PerfMonitor::Instance()->max_run_delay_time, RoomMgr::Instance()->RoomNum(), - App::Instance()->perf.entity_num[ET_Player], + PerfMonitor::Instance()->entity_num[ET_Player], PlayerMgr::Instance()->OnlineNum(), - App::Instance()->perf.alive_count, + PerfMonitor::Instance()->alive_count, f8::HttpClientPool::Instance()->max_sys_request_delay, f8::HttpClientPool::Instance()->max_user_request_delay, f8::HttpClientPool::Instance()->GetPendingNum(), - App::Instance()->perf.real_alive_count + PerfMonitor::Instance()->real_alive_count, + PlayerMgr::Instance()->GetAccountNum(), + PerfMonitor::Instance()->room_num[RT_NewBrid], + PerfMonitor::Instance()->room_num[RT_MidBrid] }); - App::Instance()->perf.max_run_delay_time = 0; - App::Instance()->perf.max_dispatchmsg_time = 0; - App::Instance()->perf.max_timer_idle = 0; - App::Instance()->perf.grid_chg_times = 0; - App::Instance()->perf.test_times = 0; - App::Instance()->perf.params[0] = 0, - App::Instance()->perf.params[1] = 0, - App::Instance()->perf.params[2] = 0, - App::Instance()->perf.params[3] = 0, - App::Instance()->perf.params[4] = 0, - App::Instance()->perf.params[5] = 0, - App::Instance()->perf.params[6] = 0, + PerfMonitor::Instance()->max_run_delay_time = 0; + PerfMonitor::Instance()->max_dispatchmsg_time = 0; + PerfMonitor::Instance()->max_timer_idle = 0; + PerfMonitor::Instance()->grid_chg_times = 0; + PerfMonitor::Instance()->test_times = 0; + PerfMonitor::Instance()->params[0] = 0, + PerfMonitor::Instance()->params[1] = 0, + PerfMonitor::Instance()->params[2] = 0, + PerfMonitor::Instance()->params[3] = 0, + PerfMonitor::Instance()->params[4] = 0, + PerfMonitor::Instance()->params[5] = 0, + PerfMonitor::Instance()->params[6] = 0, f8::HttpClientPool::Instance()->max_sys_request_delay = 0; f8::HttpClientPool::Instance()->max_user_request_delay = 0; } @@ -123,6 +128,7 @@ bool App::Init(int argc, char* argv[]) srand(time(nullptr)); InitLog(); + PerfMonitor::Instance()->Init(); HandlerMgr::Instance()->Init(); a8::Timer::Instance()->Init(); f8::MsgQueue::Instance()->Init(); @@ -178,6 +184,7 @@ void App::UnInit() f8::MsgQueue::Instance()->UnInit(); a8::Timer::Instance()->UnInit(); HandlerMgr::Instance()->UnInit(); + PerfMonitor::Instance()->UnInit(); f8::TGLog::Instance()->UnInit(); UnInitLog(); @@ -202,8 +209,8 @@ int App::Run() SlowerExecute(delta_time); Schedule(); a8::tick_t end_tick = a8::XGetTickCount(); - if (end_tick - begin_tick > perf.max_run_delay_time) { - perf.max_run_delay_time = end_tick - begin_tick; + if (end_tick - begin_tick > PerfMonitor::Instance()->max_run_delay_time) { + PerfMonitor::Instance()->max_run_delay_time = end_tick - begin_tick; } delta_time = end_tick - begin_tick; } @@ -366,8 +373,8 @@ void App::DispatchMsg() } #ifdef PERFT a8::tick_t end_tick = a8::XGetTickCount(); - if (end_tick - begin_tick > perf.max_dispatchmsg_time) { - perf.max_dispatchmsg_time = end_tick - begin_tick; + if (end_tick - begin_tick > PerfMonitor::Instance()->max_dispatchmsg_time) { + PerfMonitor::Instance()->max_dispatchmsg_time = end_tick - begin_tick; } #endif } diff --git a/server/gameserver/app.h b/server/gameserver/app.h index 73b4c02..e6839a8 100644 --- a/server/gameserver/app.h +++ b/server/gameserver/app.h @@ -56,7 +56,6 @@ public: int argc = 0; char** argv = nullptr; volatile bool terminated = false; - PerfMonitor perf; a8::uuid::SnowFlake uuid; public: diff --git a/server/gameserver/building.cc b/server/gameserver/building.cc index 198206a..9f93933 100644 --- a/server/gameserver/building.cc +++ b/server/gameserver/building.cc @@ -8,15 +8,16 @@ #include "typeconvert.h" #include "mapservice.h" #include "cs_proto.pb.h" +#include "perfmonitor.h" Building::Building():Entity() { - ++App::Instance()->perf.entity_num[ET_Building]; + ++PerfMonitor::Instance()->entity_num[ET_Building]; } Building::~Building() { - --App::Instance()->perf.entity_num[ET_Building]; + --PerfMonitor::Instance()->entity_num[ET_Building]; } void Building::Initialize() diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index e4f9785..d3779af 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -7,15 +7,16 @@ #include "obstacle.h" #include "player.h" #include "app.h" +#include "perfmonitor.h" Bullet::Bullet():MoveableEntity() { - ++App::Instance()->perf.entity_num[ET_Bullet]; + ++PerfMonitor::Instance()->entity_num[ET_Bullet]; } Bullet::~Bullet() { - --App::Instance()->perf.entity_num[ET_Bullet]; + --PerfMonitor::Instance()->entity_num[ET_Bullet]; } void Bullet::Initialize() diff --git a/server/gameserver/entity.cc b/server/gameserver/entity.cc index 83fb170..ba9ab55 100644 --- a/server/gameserver/entity.cc +++ b/server/gameserver/entity.cc @@ -6,6 +6,7 @@ #include "building.h" #include "human.h" #include "app.h" +#include "perfmonitor.h" Entity::Entity() { @@ -36,7 +37,7 @@ void Entity::GetCircleBox(CircleCollider& circle_box) bool Entity::TestCollision(Room* room, Entity* b) { - App::Instance()->perf.test_times++; + PerfMonitor::Instance()->test_times++; if (b->IsDead(room)) { return false; } diff --git a/server/gameserver/handlermgr.cc b/server/gameserver/handlermgr.cc index c6387a8..f74da1b 100644 --- a/server/gameserver/handlermgr.cc +++ b/server/gameserver/handlermgr.cc @@ -13,6 +13,7 @@ #include "cs_proto.pb.h" #include "ss_proto.pb.h" #include "jsondatamgr.h" +#include "perfmonitor.h" static void _GMOpsSelfChecking(f8::JsonHttpRequest* request) { @@ -20,8 +21,8 @@ static void _GMOpsSelfChecking(f8::JsonHttpRequest* request) request->resp_xobj->SetVal("errmsg", ""); request->resp_xobj->SetVal("healthy", 1); request->resp_xobj->SetVal("servicing", App::Instance()->servicing ? 1 : 0); - request->resp_xobj->SetVal("max_rundelay", App::Instance()->perf.max_run_delay_time); - request->resp_xobj->SetVal("max_timer_idle", App::Instance()->perf.max_timer_idle); + request->resp_xobj->SetVal("max_rundelay", PerfMonitor::Instance()->max_run_delay_time); + request->resp_xobj->SetVal("max_timer_idle", PerfMonitor::Instance()->max_timer_idle); } static void _GMOpsReload(f8::JsonHttpRequest* request) @@ -59,7 +60,7 @@ static void _GMStatGetRealTimeOnline(f8::JsonHttpRequest* request) { request->resp_xobj->SetVal("errcode", 0); request->resp_xobj->SetVal("errmsg", ""); - request->resp_xobj->SetVal("num", App::Instance()->perf.entity_num[ET_Player]); + request->resp_xobj->SetVal("num", PerfMonitor::Instance()->entity_num[ET_Player]); request->resp_xobj->SetVal("room_num", RoomMgr::Instance()->RoomNum()); } diff --git a/server/gameserver/loot.cc b/server/gameserver/loot.cc index 9fd301c..975581b 100644 --- a/server/gameserver/loot.cc +++ b/server/gameserver/loot.cc @@ -7,15 +7,16 @@ #include "entity.h" #include "app.h" #include "typeconvert.h" +#include "perfmonitor.h" Loot::Loot():RoomEntity() { - ++App::Instance()->perf.entity_num[ET_Loot]; + ++PerfMonitor::Instance()->entity_num[ET_Loot]; } Loot::~Loot() { - --App::Instance()->perf.entity_num[ET_Loot]; + --PerfMonitor::Instance()->entity_num[ET_Loot]; } void Loot::Initialize() diff --git a/server/gameserver/obstacle.cc b/server/gameserver/obstacle.cc index c825c2c..6b608e8 100644 --- a/server/gameserver/obstacle.cc +++ b/server/gameserver/obstacle.cc @@ -9,6 +9,7 @@ #include "app.h" #include "typeconvert.h" #include "bullet.h" +#include "perfmonitor.h" enum ObstacleDataFlags_e { @@ -17,12 +18,12 @@ enum ObstacleDataFlags_e Obstacle::Obstacle():Entity() { - ++App::Instance()->perf.entity_num[ET_Obstacle]; + ++PerfMonitor::Instance()->entity_num[ET_Obstacle]; } Obstacle::~Obstacle() { - --App::Instance()->perf.entity_num[ET_Obstacle]; + --PerfMonitor::Instance()->entity_num[ET_Obstacle]; } void Obstacle::Initialize() diff --git a/server/gameserver/perfmonitor.cc b/server/gameserver/perfmonitor.cc new file mode 100644 index 0000000..3f77e1a --- /dev/null +++ b/server/gameserver/perfmonitor.cc @@ -0,0 +1,13 @@ +#include "precompile.h" + +#include "perfmonitor.h" + +void PerfMonitor::Init() +{ + +} + +void PerfMonitor::UnInit() +{ + +} diff --git a/server/gameserver/perfmonitor.h b/server/gameserver/perfmonitor.h new file mode 100644 index 0000000..ade827d --- /dev/null +++ b/server/gameserver/perfmonitor.h @@ -0,0 +1,26 @@ +#pragma once + +class PerfMonitor : public a8::Singleton +{ + private: + PerfMonitor() {}; + friend class a8::Singleton; + + public: + int max_run_delay_time = 0; + int max_dispatchmsg_time = 0; + int max_timer_idle = 0; + long long out_data_size = 0; + long long in_data_size = 0; + long long read_count = 0; + long long grid_chg_times = 0; + long long test_times = 0; + long long alive_count = 0; + long long real_alive_count = 0; + std::array params = {}; + std::array entity_num = {}; + std::array room_num = {}; + + void Init(); + void UnInit(); +}; diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 4b9731f..67423ca 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -14,17 +14,20 @@ #include "app.h" #include "collider.h" #include "typeconvert.h" +#include "playermgr.h" +#include "perfmonitor.h" const int kREVIVE_BUFF_ID = 1005; Player::Player():Human() { - ++App::Instance()->perf.entity_num[ET_Player]; + ++PerfMonitor::Instance()->entity_num[ET_Player]; } Player::~Player() { - --App::Instance()->perf.entity_num[ET_Player]; + --PerfMonitor::Instance()->entity_num[ET_Player]; + PlayerMgr::Instance()->DecAccountNum(account_id); } void Player::Initialize() diff --git a/server/gameserver/playermgr.cc b/server/gameserver/playermgr.cc index 9fbb456..8bec087 100644 --- a/server/gameserver/playermgr.cc +++ b/server/gameserver/playermgr.cc @@ -142,3 +142,50 @@ void PlayerMgr::RemovePlayerBySocket(int socket_handle) socket_hash_.erase(itr); } } + +void PlayerMgr::IncAccountNum(const std::string& account_id) +{ + auto itr = account_num_hash_.find(account_id); + if (itr != account_num_hash_.end()) { + ++(itr->second); + if (itr->second > 3) { + a8::UdpLog::Instance()->Warning + ( + "IncAccountNum account_id:%s num:%d > 3", + { + account_id, + itr->second + } + ); + } + } else { + account_num_hash_[account_id] = 1; + } +} + +void PlayerMgr::DecAccountNum(const std::string& account_id) +{ + auto itr = account_num_hash_.find(account_id); + if (itr != account_num_hash_.end()) { + --(itr->second); + if (itr->second < 0) { + a8::UdpLog::Instance()->Warning + ( + "DecAccountNum account_id:%s num:%d < 0", + { + account_id, + itr->second + } + ); + account_num_hash_.erase(itr); + } + } else { + a8::UdpLog::Instance()->Warning + ( + "DecAccountNum account_id:%s not exits", + { + account_id + } + ); + } +} diff --git a/server/gameserver/playermgr.h b/server/gameserver/playermgr.h index 761ea93..3da7306 100644 --- a/server/gameserver/playermgr.h +++ b/server/gameserver/playermgr.h @@ -33,7 +33,11 @@ class PlayerMgr : public a8::Singleton Player* CreatePlayerByCMJoin(Player* hum, long ip_saddr, int socket, const cs::CMJoin& msg); void OnClientDisconnect(a8::XParams& param); void RemovePlayerBySocket(int socket_handle); + size_t GetAccountNum() { return account_num_hash_.size(); } + void IncAccountNum(const std::string& account_id); + void DecAccountNum(const std::string& account_id); private: std::map socket_hash_; + std::map account_num_hash_; }; diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index fb5c8fa..1bceee3 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -24,6 +24,7 @@ #include "gamelog.h" #include "typeconvert.h" #include "entityfactory.h" +#include "perfmonitor.h" const int ROOM_MAX_PLAYER_NUM = 40; const int SHUA_RANGE = 731; @@ -97,7 +98,7 @@ void Room::UnInit() } removed_robot_hash_.clear(); grid_service->ClearRoomData(this); - App::Instance()->perf.alive_count -= alive_count_; + PerfMonitor::Instance()->alive_count -= alive_count_; } void Room::Update(int delta_time) @@ -188,7 +189,7 @@ void Room::AddPlayer(Player* hum) MatchTeam(hum); hum->PushJoinRoomMsg(); ++alive_count_; - ++App::Instance()->perf.alive_count; + ++PerfMonitor::Instance()->alive_count; grid_service->AddHuman(hum); hum->FindLocation(); @@ -285,7 +286,7 @@ void Room::CreateAndroid(int robot_num) AddToHumanHash(hum); MatchTeam(hum); ++alive_count_; - ++App::Instance()->perf.alive_count; + ++PerfMonitor::Instance()->alive_count; refreshed_robot_set_.insert(robot_meta->i->id()); if (!CanAddToScene(hum)) { @@ -494,7 +495,7 @@ void Room::RemoveObjectLater(RoomEntity* entity) void Room::OnHumanDie(Human* hum) { --alive_count_; - --App::Instance()->perf.alive_count; + --PerfMonitor::Instance()->alive_count; RemoveFromAliveHumanHash(hum); NotifyUiUpdate(); } @@ -1288,7 +1289,7 @@ void Room::RandRemoveAndroid() RemoveFromHuamnHash(hum); AddToRemovedRobotHash(hum); --alive_count_; - --App::Instance()->perf.alive_count; + --PerfMonitor::Instance()->alive_count; for (auto& pair : human_hash_) { pair.second->RemovePartObjects(hum); } diff --git a/server/gameserver/roommgr.cc b/server/gameserver/roommgr.cc index f37a3ee..6ae68cd 100644 --- a/server/gameserver/roommgr.cc +++ b/server/gameserver/roommgr.cc @@ -14,6 +14,7 @@ #include "jsondatamgr.h" #include "playermgr.h" #include "mapmgr.h" +#include "perfmonitor.h" #include "framework/cpp/httpclientpool.h" #include "framework/cpp/utils.h" @@ -76,7 +77,7 @@ void RoomMgr::Update(int delta_time) room->Update(delta_time); real_alive_count += room->RealAliveCount(); } - App::Instance()->perf.real_alive_count = real_alive_count; + PerfMonitor::Instance()->real_alive_count = real_alive_count; } void RoomMgr::_CMJoin(f8::MsgHdr& hdr, const cs::CMJoin& msg) @@ -102,6 +103,7 @@ void RoomMgr::_CMJoin(f8::MsgHdr& hdr, const cs::CMJoin& msg) hum->ProcPrepareItems(msg.prepare_items()); hum->ProcPrepareItems2(msg.prepare_items2()); room->AddPlayer(hum); + PlayerMgr::Instance()->IncAccountNum(msg.account_id()); } int RoomMgr::RoomNum() @@ -241,7 +243,7 @@ void RoomMgr::ReportServerState(int instance_id, const std::string& host, int po url_params->SetVal("port", JsonDataMgr::Instance()->listen_port); url_params->SetVal("online_num", PlayerMgr::Instance()->OnlineNum()); url_params->SetVal("room_num", RoomNum()); - url_params->SetVal("alive_count", App::Instance()->perf.real_alive_count); + url_params->SetVal("alive_count", PerfMonitor::Instance()->real_alive_count); url_params->SetVal("servicing", App::Instance()->servicing ? 1 : 0); f8::HttpClientPool::Instance()->HttpGet(a8::XParams() .SetSender(instance_id) @@ -260,6 +262,7 @@ void RoomMgr::FreeOverRoom(long long room_uuid) { auto itr = over_room_hash_.find(room_uuid); if (itr != over_room_hash_.end()) { + --PerfMonitor::Instance()->room_num[itr->second->GetRoomType()]; itr->second->UnInit(); room_idx_hash_.erase(itr->second->GetRoomIdx()); delete itr->second; @@ -299,7 +302,7 @@ bool RoomMgr::IsLimitJoin() { return RoomNum() >= ROOM_NUM_UP_LIMIT || ( - App::Instance()->perf.real_alive_count >= HUM_NUM_DOWN_LIMIT + PerfMonitor::Instance()->real_alive_count >= HUM_NUM_DOWN_LIMIT ); } @@ -341,6 +344,7 @@ Room* RoomMgr::CreateRoom(RoomType_e room_type) inactive_room_hash_[room->GetRoomUuid()] = room; room_hash_[room->GetRoomUuid()] = room; room_idx_hash_[room->GetRoomIdx()] = room; + ++PerfMonitor::Instance()->room_num[room->GetRoomType()]; #ifdef DEBUG a8::UdpLog::Instance()->Debug("createroom room_idx:%d room_uuid:%d room_type:%d", { @@ -375,9 +379,9 @@ void RoomMgr::JoinErrorHandle(const cs::CMJoin& msg, int error_code, int socket_ { error_code, msg.account_id(), - App::Instance()->perf.max_run_delay_time, + PerfMonitor::Instance()->max_run_delay_time, RoomMgr::Instance()->RoomNum(), - App::Instance()->perf.entity_num[ET_Player], + PerfMonitor::Instance()->entity_num[ET_Player], PlayerMgr::Instance()->OnlineNum(), }); } diff --git a/server/gameserver/types.h b/server/gameserver/types.h index d90b3b5..10a5810 100755 --- a/server/gameserver/types.h +++ b/server/gameserver/types.h @@ -1,21 +1,5 @@ #pragma once -struct PerfMonitor -{ - int max_run_delay_time = 0; - int max_dispatchmsg_time = 0; - int max_timer_idle = 0; - long long out_data_size = 0; - long long in_data_size = 0; - long long read_count = 0; - long long grid_chg_times = 0; - long long test_times = 0; - long long alive_count = 0; - long long real_alive_count = 0; - std::array params = {}; - std::array entity_num = {}; -}; - namespace MetaData { struct Map;