mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
add cpu stat
This commit is contained in:
parent
4c5aae7804
commit
117fd67950
7 changed files with 510 additions and 14 deletions
|
@ -1079,6 +1079,18 @@ int SrsConfig::parse_options(int argc, char** argv)
|
|||
{
|
||||
int ret = ERROR_SUCCESS;
|
||||
|
||||
for (int i = 0; i < argc; i++) {
|
||||
_argv.append(argv[i]);
|
||||
|
||||
if (i < argc - 1) {
|
||||
_argv.append(" ");
|
||||
}
|
||||
}
|
||||
|
||||
char cwd[256];
|
||||
getcwd(cwd, sizeof(cwd));
|
||||
_cwd = cwd;
|
||||
|
||||
show_help = true;
|
||||
for (int i = 1; i < argc; i++) {
|
||||
if ((ret = parse_argv(i, argv)) != ERROR_SUCCESS) {
|
||||
|
@ -1239,6 +1251,16 @@ void SrsConfig::print_help(char** argv)
|
|||
argv[0], argv[0], argv[0], argv[0]);
|
||||
}
|
||||
|
||||
string SrsConfig::get_cwd()
|
||||
{
|
||||
return _cwd;
|
||||
}
|
||||
|
||||
string SrsConfig::get_argv()
|
||||
{
|
||||
return _argv;
|
||||
}
|
||||
|
||||
bool SrsConfig::get_deamon()
|
||||
{
|
||||
srs_assert(root);
|
||||
|
|
|
@ -120,6 +120,8 @@ private:
|
|||
bool test_conf;
|
||||
bool show_version;
|
||||
std::string config_file;
|
||||
std::string _argv;
|
||||
std::string _cwd;
|
||||
SrsConfDirective* root;
|
||||
std::vector<ISrsReloadHandler*> subscribes;
|
||||
public:
|
||||
|
@ -143,6 +145,9 @@ private:
|
|||
virtual int parse_file(const char* filename);
|
||||
virtual int parse_argv(int& i, char** argv);
|
||||
virtual void print_help(char** argv);
|
||||
public:
|
||||
virtual std::string get_cwd();
|
||||
virtual std::string get_argv();
|
||||
// global section
|
||||
public:
|
||||
virtual SrsConfDirective* get_root();
|
||||
|
|
|
@ -34,6 +34,8 @@ using namespace std;
|
|||
#include <srs_app_socket.hpp>
|
||||
#include <srs_core_autofree.hpp>
|
||||
#include <srs_app_json.hpp>
|
||||
#include <srs_app_config.hpp>
|
||||
#include <srs_kernel_utility.hpp>
|
||||
|
||||
SrsApiRoot::SrsApiRoot()
|
||||
{
|
||||
|
@ -114,6 +116,8 @@ int SrsApiApi::do_process_request(SrsSocket* skt, SrsHttpMessage* req)
|
|||
SrsApiV1::SrsApiV1()
|
||||
{
|
||||
handlers.push_back(new SrsApiVersion());
|
||||
handlers.push_back(new SrsApiSummaries());
|
||||
handlers.push_back(new SrsApiRusages());
|
||||
handlers.push_back(new SrsApiAuthors());
|
||||
}
|
||||
|
||||
|
@ -134,6 +138,9 @@ int SrsApiV1::do_process_request(SrsSocket* skt, SrsHttpMessage* req)
|
|||
<< JFIELD_ERROR(ERROR_SUCCESS) << JFIELD_CONT
|
||||
<< JFIELD_ORG("urls", JOBJECT_START)
|
||||
<< JFIELD_STR("versions", "the version of SRS") << JFIELD_CONT
|
||||
<< JFIELD_STR("summaries", "the summary(pid, argv, pwd, cpu, mem) of SRS") << JFIELD_CONT
|
||||
<< JFIELD_STR("rusages", "the rusage of SRS") << JFIELD_CONT
|
||||
<< JFIELD_STR("proc_stats", "the /proc/self/stat of SRS") << JFIELD_CONT
|
||||
<< JFIELD_STR("authors", "the primary authors and contributors")
|
||||
<< JOBJECT_END
|
||||
<< JOBJECT_END;
|
||||
|
@ -171,6 +178,89 @@ int SrsApiVersion::do_process_request(SrsSocket* skt, SrsHttpMessage* req)
|
|||
return res_json(skt, req, ss.str());
|
||||
}
|
||||
|
||||
SrsApiSummaries::SrsApiSummaries()
|
||||
{
|
||||
}
|
||||
|
||||
SrsApiSummaries::~SrsApiSummaries()
|
||||
{
|
||||
}
|
||||
|
||||
bool SrsApiSummaries::can_handle(const char* path, int length, const char** /*pchild*/)
|
||||
{
|
||||
return srs_path_equals("/summaries", path, length);
|
||||
}
|
||||
|
||||
int SrsApiSummaries::do_process_request(SrsSocket* skt, SrsHttpMessage* req)
|
||||
{
|
||||
std::stringstream ss;
|
||||
|
||||
SrsRusage* r = srs_get_system_rusage();
|
||||
SrsCpuSelfStat* u = srs_get_self_cpu_stat();
|
||||
SrsCpuSystemStat* s = srs_get_system_cpu_stat();
|
||||
|
||||
ss << JOBJECT_START
|
||||
<< JFIELD_ERROR(ERROR_SUCCESS) << JFIELD_CONT
|
||||
<< JFIELD_ORG("data", JOBJECT_START)
|
||||
<< JFIELD_ORG("pid", getpid()) << JFIELD_CONT
|
||||
<< JFIELD_STR("argv", _srs_config->get_argv()) << JFIELD_CONT
|
||||
<< JFIELD_STR("cwd", _srs_config->get_cwd()) << JFIELD_CONT
|
||||
<< JFIELD_ORG("rusage_ok", (r->ok? "true":"false")) << JFIELD_CONT
|
||||
<< JFIELD_ORG("self_cpu_stat_ok", (u->ok? "true":"false")) << JFIELD_CONT
|
||||
<< JFIELD_ORG("system_cpu_stat_ok", (s->ok? "true":"false")) << JFIELD_CONT
|
||||
<< JFIELD_ORG("mem_kbyte", r->r.ru_maxrss) << JFIELD_CONT
|
||||
<< JFIELD_ORG("ppid", u->ppid)
|
||||
<< JOBJECT_END
|
||||
<< JOBJECT_END;
|
||||
|
||||
return res_json(skt, req, ss.str());
|
||||
}
|
||||
|
||||
SrsApiRusages::SrsApiRusages()
|
||||
{
|
||||
}
|
||||
|
||||
SrsApiRusages::~SrsApiRusages()
|
||||
{
|
||||
}
|
||||
|
||||
bool SrsApiRusages::can_handle(const char* path, int length, const char** /*pchild*/)
|
||||
{
|
||||
return srs_path_equals("/rusages", path, length);
|
||||
}
|
||||
|
||||
int SrsApiRusages::do_process_request(SrsSocket* skt, SrsHttpMessage* req)
|
||||
{
|
||||
std::stringstream ss;
|
||||
|
||||
SrsRusage* r = srs_get_system_rusage();
|
||||
|
||||
ss << JOBJECT_START
|
||||
<< JFIELD_ERROR(ERROR_SUCCESS) << JFIELD_CONT
|
||||
<< JFIELD_ORG("data", JOBJECT_START)
|
||||
<< JFIELD_ORG("rusage_ok", (r->ok? "true":"false")) << JFIELD_CONT
|
||||
<< JFIELD_ORG("ru_utime", r->r.ru_utime.tv_sec) << JFIELD_CONT
|
||||
<< JFIELD_ORG("ru_stime", r->r.ru_stime.tv_sec) << JFIELD_CONT
|
||||
<< JFIELD_ORG("ru_maxrss", r->r.ru_maxrss) << JFIELD_CONT
|
||||
<< JFIELD_ORG("ru_ixrss", r->r.ru_ixrss) << JFIELD_CONT
|
||||
<< JFIELD_ORG("ru_idrss", r->r.ru_idrss) << JFIELD_CONT
|
||||
<< JFIELD_ORG("ru_isrss", r->r.ru_isrss) << JFIELD_CONT
|
||||
<< JFIELD_ORG("ru_minflt", r->r.ru_minflt) << JFIELD_CONT
|
||||
<< JFIELD_ORG("ru_majflt", r->r.ru_majflt) << JFIELD_CONT
|
||||
<< JFIELD_ORG("ru_nswap", r->r.ru_nswap) << JFIELD_CONT
|
||||
<< JFIELD_ORG("ru_inblock", r->r.ru_inblock) << JFIELD_CONT
|
||||
<< JFIELD_ORG("ru_oublock", r->r.ru_oublock) << JFIELD_CONT
|
||||
<< JFIELD_ORG("ru_msgsnd", r->r.ru_msgsnd) << JFIELD_CONT
|
||||
<< JFIELD_ORG("ru_msgrcv", r->r.ru_msgrcv) << JFIELD_CONT
|
||||
<< JFIELD_ORG("ru_nsignals", r->r.ru_nsignals) << JFIELD_CONT
|
||||
<< JFIELD_ORG("ru_nvcsw", r->r.ru_nvcsw) << JFIELD_CONT
|
||||
<< JFIELD_ORG("ru_nivcsw", r->r.ru_nivcsw)
|
||||
<< JOBJECT_END
|
||||
<< JOBJECT_END;
|
||||
|
||||
return res_json(skt, req, ss.str());
|
||||
}
|
||||
|
||||
SrsApiAuthors::SrsApiAuthors()
|
||||
{
|
||||
}
|
||||
|
|
|
@ -87,6 +87,28 @@ protected:
|
|||
virtual int do_process_request(SrsSocket* skt, SrsHttpMessage* req);
|
||||
};
|
||||
|
||||
class SrsApiSummaries : public SrsHttpHandler
|
||||
{
|
||||
public:
|
||||
SrsApiSummaries();
|
||||
virtual ~SrsApiSummaries();
|
||||
public:
|
||||
virtual bool can_handle(const char* path, int length, const char** pchild);
|
||||
protected:
|
||||
virtual int do_process_request(SrsSocket* skt, SrsHttpMessage* req);
|
||||
};
|
||||
|
||||
class SrsApiRusages : public SrsHttpHandler
|
||||
{
|
||||
public:
|
||||
SrsApiRusages();
|
||||
virtual ~SrsApiRusages();
|
||||
public:
|
||||
virtual bool can_handle(const char* path, int length, const char** pchild);
|
||||
protected:
|
||||
virtual int do_process_request(SrsSocket* skt, SrsHttpMessage* req);
|
||||
};
|
||||
|
||||
class SrsApiAuthors : public SrsHttpHandler
|
||||
{
|
||||
public:
|
||||
|
|
|
@ -46,7 +46,21 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
#endif
|
||||
|
||||
#define SERVER_LISTEN_BACKLOG 512
|
||||
#define SRS_SYS_TIME_RESOLUTION_MS 500
|
||||
|
||||
// system interval
|
||||
#define SRS_SYS_CYCLE_INTERVAL 100
|
||||
|
||||
// update time interval:
|
||||
// SRS_SYS_CYCLE_INTERVAL * SRS_SYS_TIME_RESOLUTION_MS_TIMES
|
||||
#define SRS_SYS_TIME_RESOLUTION_MS_TIMES 3
|
||||
|
||||
// update rusage interval:
|
||||
// SRS_SYS_CYCLE_INTERVAL * SRS_SYS_RUSAGE_RESOLUTION_TIMES
|
||||
#define SRS_SYS_RUSAGE_RESOLUTION_TIMES 15
|
||||
|
||||
// update rusage interval:
|
||||
// SRS_SYS_CYCLE_INTERVAL * SRS_SYS_CPU_STAT_RESOLUTION_TIMES
|
||||
#define SRS_SYS_CPU_STAT_RESOLUTION_TIMES 15
|
||||
|
||||
SrsListener::SrsListener(SrsServer* server, SrsListenerType type)
|
||||
{
|
||||
|
@ -393,10 +407,15 @@ int SrsServer::cycle()
|
|||
{
|
||||
int ret = ERROR_SUCCESS;
|
||||
|
||||
// find the max loop
|
||||
int max = srs_max(0, SRS_SYS_TIME_RESOLUTION_MS_TIMES);
|
||||
max = srs_max(max, SRS_SYS_RUSAGE_RESOLUTION_TIMES);
|
||||
max = srs_max(max, SRS_SYS_CPU_STAT_RESOLUTION_TIMES);
|
||||
|
||||
// the deamon thread, update the time cache
|
||||
while (true) {
|
||||
st_usleep(SRS_SYS_TIME_RESOLUTION_MS * 1000);
|
||||
srs_update_system_time_ms();
|
||||
for (int i = 1; i < max + 1; i++) {
|
||||
st_usleep(SRS_SYS_CYCLE_INTERVAL * 1000);
|
||||
|
||||
// for gperf heap checker,
|
||||
// @see: research/gperftools/heap-checker/heap_checker.cc
|
||||
|
@ -404,20 +423,32 @@ int SrsServer::cycle()
|
|||
// but, if gperf, use reload to ensure main return normally,
|
||||
// because directly exit will cause core-dump.
|
||||
#ifdef SRS_AUTO_GPERF_MC
|
||||
if (signal_gmc_stop) {
|
||||
break;
|
||||
}
|
||||
if (signal_gmc_stop) {
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (signal_reload) {
|
||||
signal_reload = false;
|
||||
srs_info("get signal reload, to reload the config.");
|
||||
|
||||
if ((ret = _srs_config->reload()) != ERROR_SUCCESS) {
|
||||
srs_error("reload config failed. ret=%d", ret);
|
||||
return ret;
|
||||
if (signal_reload) {
|
||||
signal_reload = false;
|
||||
srs_info("get signal reload, to reload the config.");
|
||||
|
||||
if ((ret = _srs_config->reload()) != ERROR_SUCCESS) {
|
||||
srs_error("reload config failed. ret=%d", ret);
|
||||
return ret;
|
||||
}
|
||||
srs_trace("reload config success.");
|
||||
}
|
||||
|
||||
// update the cache time or rusage.
|
||||
if (i == SRS_SYS_TIME_RESOLUTION_MS_TIMES) {
|
||||
srs_update_system_time_ms();
|
||||
}
|
||||
if (i == SRS_SYS_RUSAGE_RESOLUTION_TIMES) {
|
||||
srs_update_system_rusage();
|
||||
}
|
||||
if (i == SRS_SYS_CPU_STAT_RESOLUTION_TIMES) {
|
||||
srs_update_system_cpu_stat();
|
||||
}
|
||||
srs_trace("reload config success.");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue