1
0
Fork 0
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:
winlin 2014-04-19 21:23:34 +08:00
parent 4c5aae7804
commit 117fd67950
7 changed files with 510 additions and 14 deletions

View file

@ -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);

View file

@ -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();

View file

@ -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()
{
}

View file

@ -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:

View file

@ -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.");
}
}