1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

Clock: Update stat. Insert timer to execute first

This commit is contained in:
winlin 2021-02-11 17:34:03 +08:00
parent fb61a6979c
commit 321f555e30
10 changed files with 112 additions and 65 deletions

View file

@ -3640,7 +3640,7 @@ srs_error_t SrsConfig::check_normal_config()
SrsConfDirective* conf = get_stats();
for (int i = 0; conf && i < (int)conf->directives.size(); i++) {
string n = conf->at(i)->name;
if (n != "network" && n != "disk") {
if (n != "enabled" && n != "network" && n != "disk") {
return srs_error_new(ERROR_SYSTEM_CONFIG_INVALID, "illegal stats.%s", n.c_str());
}
}
@ -8353,6 +8353,23 @@ SrsConfDirective* SrsConfig::get_stats()
return root->get("stats");
}
bool SrsConfig::get_stats_enabled()
{
static bool DEFAULT = true;
SrsConfDirective* conf = get_stats();
if (!conf) {
return DEFAULT;
}
conf = conf->get("enabled");
if (!conf || conf->arg0().empty()) {
return DEFAULT;
}
return SRS_CONF_PERFER_TRUE(conf->arg0());
}
int SrsConfig::get_stats_network()
{
static int DEFAULT = 0;

View file

@ -1084,6 +1084,8 @@ private:
// Get the stats directive.
virtual SrsConfDirective* get_stats();
public:
// Whether enabled stats.
virtual bool get_stats_enabled();
// Get the network device index, used to retrieve the ip of device,
// For heartbeat to report to server, or to get the local ip.
// For example, 0 means the eth0 maybe.

View file

@ -83,23 +83,23 @@ SrsPps* _srs_pps_epoll_zero = new SrsPps(_srs_clock);
SrsPps* _srs_pps_epoll_shake = new SrsPps(_srs_clock);
SrsPps* _srs_pps_epoll_spin = new SrsPps(_srs_clock);
extern unsigned long long _st_stat_sched_us;
extern unsigned long long _st_stat_sched_10ms;
extern unsigned long long _st_stat_sched_15ms;
extern unsigned long long _st_stat_sched_20ms;
extern unsigned long long _st_stat_sched_25ms;
extern unsigned long long _st_stat_sched_30ms;
extern unsigned long long _st_stat_sched_35ms;
extern unsigned long long _st_stat_sched_40ms;
extern unsigned long long _st_stat_sched_80ms;
extern unsigned long long _st_stat_sched_160ms;
extern unsigned long long _st_stat_sched_320ms;
extern unsigned long long _st_stat_sched_1000ms;
extern unsigned long long _st_stat_sched_s;
SrsPps* _srs_pps_sched_us = new SrsPps(_srs_clock);
SrsPps* _srs_pps_sched_10ms = new SrsPps(_srs_clock);
SrsPps* _srs_pps_sched_15ms = new SrsPps(_srs_clock);
SrsPps* _srs_pps_sched_20ms = new SrsPps(_srs_clock);
SrsPps* _srs_pps_sched_25ms = new SrsPps(_srs_clock);
SrsPps* _srs_pps_sched_30ms = new SrsPps(_srs_clock);
SrsPps* _srs_pps_sched_35ms = new SrsPps(_srs_clock);
SrsPps* _srs_pps_sched_40ms = new SrsPps(_srs_clock);
SrsPps* _srs_pps_sched_80ms = new SrsPps(_srs_clock);
SrsPps* _srs_pps_sched_160ms = new SrsPps(_srs_clock);
SrsPps* _srs_pps_sched_320ms = new SrsPps(_srs_clock);
SrsPps* _srs_pps_sched_1000ms = new SrsPps(_srs_clock);
SrsPps* _srs_pps_sched_s = new SrsPps(_srs_clock);
SrsPps* _srs_pps_clock_15ms = new SrsPps(_srs_clock);
@ -112,6 +112,7 @@ SrsPps* _srs_pps_clock_80ms = new SrsPps(_srs_clock);
SrsPps* _srs_pps_clock_160ms = new SrsPps(_srs_clock);
SrsPps* _srs_pps_timer_s = new SrsPps(_srs_clock);
extern int _st_active_count;
extern unsigned long long _st_stat_thread_run;
extern unsigned long long _st_stat_thread_idle;
SrsPps* _srs_pps_thread_run = new SrsPps(_srs_clock);
@ -277,6 +278,9 @@ SrsServerAdapter* SrsHybridServer::srs()
return NULL;
}
extern void _srs_coroutine_switch_in();
extern void _srs_coroutine_switch_out();
srs_error_t SrsHybridServer::setup_ticks()
{
srs_error_t err = srs_success;
@ -401,13 +405,13 @@ srs_error_t SrsHybridServer::notify(int event, srs_utime_t interval, srs_utime_t
}
string sched_desc;
_srs_pps_sched_us->update(_st_stat_sched_us); _srs_pps_sched_s->update(_st_stat_sched_s);
_srs_pps_sched_10ms->update(_st_stat_sched_10ms); _srs_pps_sched_20ms->update(_st_stat_sched_20ms);
_srs_pps_sched_40ms->update(_st_stat_sched_40ms); _srs_pps_sched_80ms->update(_st_stat_sched_80ms);
_srs_pps_sched_160ms->update(_st_stat_sched_160ms); _srs_pps_sched_320ms->update(_st_stat_sched_320ms);
_srs_pps_sched_1000ms->update(_st_stat_sched_1000ms);
if (_srs_pps_sched_us->r10s() || _srs_pps_sched_s->r10s() || _srs_pps_sched_10ms->r10s() || _srs_pps_sched_20ms->r10s() || _srs_pps_sched_40ms->r10s() || _srs_pps_sched_80ms->r10s() || _srs_pps_sched_160ms->r10s() || _srs_pps_sched_320ms->r10s() || _srs_pps_sched_1000ms->r10s()) {
snprintf(buf, sizeof(buf), ", sched=%d,%d,%d,%d,%d,%d,%d,%d,%d", _srs_pps_sched_us->r10s(), _srs_pps_sched_10ms->r10s(), _srs_pps_sched_20ms->r10s(), _srs_pps_sched_40ms->r10s(), _srs_pps_sched_80ms->r10s(), _srs_pps_sched_160ms->r10s(), _srs_pps_sched_320ms->r10s(), _srs_pps_sched_1000ms->r10s(), _srs_pps_sched_s->r10s());
_srs_pps_sched_160ms->update(_st_stat_sched_160ms); _srs_pps_sched_s->update(_st_stat_sched_s);
_srs_pps_sched_15ms->update(_st_stat_sched_15ms); _srs_pps_sched_20ms->update(_st_stat_sched_20ms);
_srs_pps_sched_25ms->update(_st_stat_sched_25ms); _srs_pps_sched_30ms->update(_st_stat_sched_30ms);
_srs_pps_sched_35ms->update(_st_stat_sched_35ms); _srs_pps_sched_40ms->update(_st_stat_sched_40ms);
_srs_pps_sched_80ms->update(_st_stat_sched_80ms);
if (_srs_pps_sched_160ms->r10s() || _srs_pps_sched_s->r10s() || _srs_pps_sched_15ms->r10s() || _srs_pps_sched_20ms->r10s() || _srs_pps_sched_25ms->r10s() || _srs_pps_sched_30ms->r10s() || _srs_pps_sched_35ms->r10s() || _srs_pps_sched_40ms->r10s() || _srs_pps_sched_80ms->r10s()) {
snprintf(buf, sizeof(buf), ", sched=%d,%d,%d,%d,%d,%d,%d,%d,%d", _srs_pps_sched_15ms->r10s(), _srs_pps_sched_20ms->r10s(), _srs_pps_sched_25ms->r10s(), _srs_pps_sched_30ms->r10s(), _srs_pps_sched_35ms->r10s(), _srs_pps_sched_40ms->r10s(), _srs_pps_sched_80ms->r10s(), _srs_pps_sched_160ms->r10s(), _srs_pps_sched_s->r10s());
sched_desc = buf;
}
@ -424,8 +428,8 @@ srs_error_t SrsHybridServer::notify(int event, srs_utime_t interval, srs_utime_t
string thread_desc;
_srs_pps_thread_run->update(_st_stat_thread_run); _srs_pps_thread_idle->update(_st_stat_thread_idle);
if (_srs_pps_thread_run->r10s() || _srs_pps_thread_idle->r10s()) {
snprintf(buf, sizeof(buf), ", co=%d,%d", _srs_pps_thread_run->r10s(), _srs_pps_thread_idle->r10s());
if (_st_active_count > 0 || _srs_pps_thread_run->r10s() || _srs_pps_thread_idle->r10s()) {
snprintf(buf, sizeof(buf), ", co=%d,%d,%d", _st_active_count, _srs_pps_thread_run->r10s(), _srs_pps_thread_idle->r10s());
thread_desc = buf;
}

View file

@ -1270,27 +1270,31 @@ srs_error_t SrsServer::setup_ticks()
srs_freep(timer_);
timer_ = new SrsHourGlass("srs", this, 1 * SRS_UTIME_SECONDS);
if ((err = timer_->tick(2, 3 * SRS_UTIME_SECONDS)) != srs_success) {
return srs_error_wrap(err, "tick");
}
if ((err = timer_->tick(3, 3 * SRS_UTIME_SECONDS)) != srs_success) {
return srs_error_wrap(err, "tick");
}
if ((err = timer_->tick(4, 6 * SRS_UTIME_SECONDS)) != srs_success) {
return srs_error_wrap(err, "tick");
}
if ((err = timer_->tick(5, 6 * SRS_UTIME_SECONDS)) != srs_success) {
return srs_error_wrap(err, "tick");
}
if ((err = timer_->tick(6, 9 * SRS_UTIME_SECONDS)) != srs_success) {
return srs_error_wrap(err, "tick");
}
if ((err = timer_->tick(7, 9 * SRS_UTIME_SECONDS)) != srs_success) {
return srs_error_wrap(err, "tick");
}
if ((err = timer_->tick(8, 3 * SRS_UTIME_SECONDS)) != srs_success) {
return srs_error_wrap(err, "tick");
if (_srs_config->get_stats_enabled()) {
if ((err = timer_->tick(2, 3 * SRS_UTIME_SECONDS)) != srs_success) {
return srs_error_wrap(err, "tick");
}
if ((err = timer_->tick(3, 3 * SRS_UTIME_SECONDS)) != srs_success) {
return srs_error_wrap(err, "tick");
}
if ((err = timer_->tick(4, 6 * SRS_UTIME_SECONDS)) != srs_success) {
return srs_error_wrap(err, "tick");
}
if ((err = timer_->tick(5, 6 * SRS_UTIME_SECONDS)) != srs_success) {
return srs_error_wrap(err, "tick");
}
if ((err = timer_->tick(6, 9 * SRS_UTIME_SECONDS)) != srs_success) {
return srs_error_wrap(err, "tick");
}
if ((err = timer_->tick(7, 9 * SRS_UTIME_SECONDS)) != srs_success) {
return srs_error_wrap(err, "tick");
}
if ((err = timer_->tick(8, 3 * SRS_UTIME_SECONDS)) != srs_success) {
return srs_error_wrap(err, "tick");
}
}
if (_srs_config->get_heartbeat_enabled()) {
if ((err = timer_->tick(9, _srs_config->get_heartbeat_interval())) != srs_success) {
return srs_error_wrap(err, "tick");

View file

@ -43,6 +43,13 @@ SrsRateSample* SrsRateSample::update(int64_t nn, srs_utime_t t, int k)
return this;
}
void srs_pps_init(SrsRateSample& sample, int64_t nn, srs_utime_t now)
{
if (sample.time < 0 || nn < sample.total) {
sample.update(nn, now, 0);
}
}
void srs_pps_update(SrsRateSample& sample, int64_t nn, srs_utime_t now)
{
int pps = (int)((nn - sample.total) * 1000 / srsu2ms(now - sample.time));
@ -71,18 +78,11 @@ void SrsPps::update(int64_t nn)
{
srs_utime_t now = clk_->now();
if (sample_30s_.time < 0) {
sample_30s_.update(nn, now, 0);
}
if (sample_1m_.time < 0) {
sample_1m_.update(nn, now, 0);
}
if (sample_5m_.time < 0) {
sample_5m_.update(nn, now, 0);
}
if (sample_60m_.time < 0) {
sample_60m_.update(nn, now, 0);
}
srs_pps_init(sample_10s_, nn, now);
srs_pps_init(sample_30s_, nn, now);
srs_pps_init(sample_1m_, nn, now);
srs_pps_init(sample_5m_, nn, now);
srs_pps_init(sample_60m_, nn, now);
if (now - sample_10s_.time >= 10 * SRS_UTIME_SECONDS) {
srs_pps_update(sample_10s_, nn, now);