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

for #319, refine config, collect the mr and publish timeout

This commit is contained in:
winlin 2015-08-29 22:41:50 +08:00
parent bc100c2867
commit 738642073e
11 changed files with 197 additions and 144 deletions

View file

@ -21,15 +21,25 @@ http_stream {
dir ./objs/nginx/html;
}
vhost __defaultVhost__ {
# for SRS2.
refer github.com github.io;
refer_publish github.com github.io;
refer_play github.com github.io;
# for SRS1.
http {
enabled on;
mount [vhost]/hls;
dir ./objs/nginx/html/hls;
}
# for SRS2.
refer github.com github.io;
refer_publish github.com github.io;
refer_play github.com github.io;
# for SRS2
publish_1stpkt_timeout 20000;
publish_normal_timeout 7000;
# for SRS2
mr {
enabled off;
latency 350;
}
}

View file

@ -334,40 +334,6 @@ vhost security.srs.com {
}
}
# the MR(merged-read) setting for publisher.
# the MW(merged-write) settings for player.
vhost mrw.srs.com {
# whether enable min delay mode for vhost.
# for min latence mode:
# 1. disable the mr for vhost.
# 2. use timeout for cond wait for consumer queue.
# @see https://github.com/simple-rtmp-server/srs/issues/257
# default: off
min_latency off;
# about MR, read https://github.com/simple-rtmp-server/srs/issues/241
mr {
# whether enable the MR(merged-read)
# default: off
enabled on;
# the latency in ms for MR(merged-read),
# the performance+ when latency+, and memory+,
# memory(buffer) = latency * kbps / 8
# for example, latency=500ms, kbps=3000kbps, each publish connection will consume
# memory = 500 * 3000 / 8 = 187500B = 183KB
# when there are 2500 publisher, the total memory of SRS atleast:
# 183KB * 2500 = 446MB
# the value recomment is [300, 2000]
# default: 350
latency 350;
}
# set the MW(merged-write) latency in ms.
# SRS always set mw on, so we just set the latency value.
# the latency of stream >= mw_latency + mr_latency
# the value recomment is [300, 1800]
# default: 350
mw_latency 350;
}
# vhost for edge, edge and origin is the same vhost
vhost same.edge.srs.com {
# the mode of vhost, local or remote.
@ -966,6 +932,58 @@ vhost debug.srs.com {
debug_srs_upnode on;
}
# the publish specified configs
vhost publish.srs.com {
# the config for FMLE/Flash publisher, which push RTMP to SRS.
publish {
# about MR, read https://github.com/simple-rtmp-server/srs/issues/241
# when enabled the mr, SRS will read as large as possible.
# default: off
mr off;
# the latency in ms for MR(merged-read),
# the performance+ when latency+, and memory+,
# memory(buffer) = latency * kbps / 8
# for example, latency=500ms, kbps=3000kbps, each publish connection will consume
# memory = 500 * 3000 / 8 = 187500B = 183KB
# when there are 2500 publisher, the total memory of SRS atleast:
# 183KB * 2500 = 446MB
# the value recomment is [300, 2000]
# default: 350
mr_latency 350;
# the 1st packet timeout in ms for encoder.
# default: 20000
firstpkt_timeout 20000;
# the normal packet timeout in ms for encoder.
# default: 5000
normal_timeout 7000;
}
}
# the MR(merged-read) setting for publisher.
# the MW(merged-write) settings for player.
vhost mrw.srs.com {
# whether enable min delay mode for vhost.
# for min latence mode:
# 1. disable the publish.mr for vhost.
# 2. use timeout for cond wait for consumer queue.
# @see https://github.com/simple-rtmp-server/srs/issues/257
# default: off
min_latency off;
# set the MW(merged-write) latency in ms.
# SRS always set mw on, so we just set the latency value.
# the latency of stream >= mw_latency + mr_latency
# the value recomment is [300, 1800]
# default: 350
mw_latency 350;
# @see publish.srs.com
publish {
mr off;
mr_latenct 350;
}
}
# the vhost for min delay, donot cache any stream.
vhost min.delay.com {
# @see vhost mrw.srs.com for detail.
@ -1019,12 +1037,12 @@ vhost stream.control.com {
# while the sequence header is not changed yet.
# default: off
reduce_sequence_header on;
# the 1st packet timeout in ms for encoder.
# default: 20000
publish_1stpkt_timeout 20000;
# the normal packet timeout in ms for encoder.
# default: 5000
publish_normal_timeout 7000;
# @see publish.srs.com
publish {
firstpkt_timeout 20000;
normal_timeout 7000;
}
}
# the vhost which forward publish streams.

View file

@ -66,17 +66,20 @@ vhost vhost.srs.com {
atc_auto on;
min_latency on;
mr {
enabled off;
}
mw_latency 100;
gop_cache off;
queue_length 10;
tcp_nodelay on;
send_min_interval 10.0;
reduce_sequence_header on;
publish_1stpkt_timeout 20000;
publish_normal_timeout 7000;
publish {
mr off;
mr_latency 350;
firstpkt_timeout 20000;
normal_timeout 7000;
}
refer {
enabled off;

View file

@ -8,9 +8,9 @@ vhost __defaultVhost__ {
gop_cache off;
queue_length 10;
min_latency on;
mr {
enabled off;
}
mw_latency 100;
tcp_nodelay on;
publish {
mr off;
}
}

View file

@ -816,16 +816,16 @@ int SrsConfig::reload_vhost(SrsConfDirective* old_root)
srs_trace("vhost %s reload exec success.", vhost.c_str());
}
// mr, only one per vhost
if (!srs_directive_equals(new_vhost->get("mr"), old_vhost->get("mr"))) {
// publish, only one per vhost
if (!srs_directive_equals(new_vhost->get("publish"), old_vhost->get("publish"))) {
for (it = subscribes.begin(); it != subscribes.end(); ++it) {
ISrsReloadHandler* subscribe = *it;
if ((ret = subscribe->on_reload_vhost_mr(vhost)) != ERROR_SUCCESS) {
srs_error("vhost %s notify subscribes mr failed. ret=%d", vhost.c_str(), ret);
if ((ret = subscribe->on_reload_vhost_publish(vhost)) != ERROR_SUCCESS) {
srs_error("vhost %s notify subscribes publish failed. ret=%d", vhost.c_str(), ret);
return ret;
}
}
srs_trace("vhost %s reload mr success.", vhost.c_str());
srs_trace("vhost %s reload publish success.", vhost.c_str());
}
// chunk_size, only one per vhost.
@ -876,30 +876,6 @@ int SrsConfig::reload_vhost(SrsConfDirective* old_root)
srs_trace("vhost %s reload tcp_nodelay success.", vhost.c_str());
}
// publish_1stpkt_timeout, only one per vhost
if (!srs_directive_equals(new_vhost->get("publish_1stpkt_timeout"), old_vhost->get("publish_1stpkt_timeout"))) {
for (it = subscribes.begin(); it != subscribes.end(); ++it) {
ISrsReloadHandler* subscribe = *it;
if ((ret = subscribe->on_reload_vhost_p1stpt(vhost)) != ERROR_SUCCESS) {
srs_error("vhost %s notify subscribes p1stpt failed. ret=%d", vhost.c_str(), ret);
return ret;
}
}
srs_trace("vhost %s reload p1stpt success.", vhost.c_str());
}
// publish_normal_timeout, only one per vhost
if (!srs_directive_equals(new_vhost->get("publish_normal_timeout"), old_vhost->get("publish_normal_timeout"))) {
for (it = subscribes.begin(); it != subscribes.end(); ++it) {
ISrsReloadHandler* subscribe = *it;
if ((ret = subscribe->on_reload_vhost_pnt(vhost)) != ERROR_SUCCESS) {
srs_error("vhost %s notify subscribes pnt failed. ret=%d", vhost.c_str(), ret);
return ret;
}
}
srs_trace("vhost %s reload pnt success.", vhost.c_str());
}
// min_latency, only one per vhost
if (!srs_directive_equals(new_vhost->get("min_latency"), old_vhost->get("min_latency"))) {
for (it = subscribes.begin(); it != subscribes.end(); ++it) {
@ -1798,20 +1774,6 @@ int SrsConfig::vhost_to_json(SrsConfDirective* vhost, SrsAmf0Object* obj)
if ((dir = vhost->get("min_latency")) != NULL) {
obj->set("min_latency", dir->dumps_arg0_to_boolean());
}
if ((dir = vhost->get("mr")) != NULL) {
SrsAmf0Object* mr = SrsAmf0Any::object();
obj->set("mr", mr);
for (int i = 0; i < (int)dir->directives.size(); i++) {
SrsConfDirective* sdir = dir->directives.at(i);
if (sdir->name == "enabled") {
mr->set("enabled", sdir->dumps_arg0_to_boolean());
} else if (sdir->name == "latency") {
mr->set("latency", sdir->dumps_arg0_to_number());
}
}
}
if ((dir = vhost->get("mw_latency")) != NULL) {
obj->set("mw_latency", dir->dumps_arg0_to_number());
}
@ -1834,11 +1796,25 @@ int SrsConfig::vhost_to_json(SrsConfDirective* vhost, SrsAmf0Object* obj)
if ((dir = vhost->get("reduce_sequence_header")) != NULL) {
obj->set("reduce_sequence_header", dir->dumps_arg0_to_boolean());
}
if ((dir = vhost->get("publish_1stpkt_timeout")) != NULL) {
obj->set("publish_1stpkt_timeout", dir->dumps_arg0_to_number());
}
if ((dir = vhost->get("publish_normal_timeout")) != NULL) {
obj->set("publish_normal_timeout", dir->dumps_arg0_to_number());
// publish
if ((dir = vhost->get("publish")) != NULL) {
SrsAmf0Object* publish = SrsAmf0Any::object();
obj->set("publish", publish);
for (int i = 0; i < (int)dir->directives.size(); i++) {
SrsConfDirective* sdir = dir->directives.at(i);
if (sdir->name == "mr") {
publish->set("mr", sdir->dumps_arg0_to_boolean());
} else if (sdir->name == "mr_latency") {
publish->set("mr_latency", sdir->dumps_arg0_to_number());
} else if (sdir->name == "firstpkt_timeout") {
publish->set("firstpkt_timeout", sdir->dumps_arg0_to_number());
} else if (sdir->name == "normal_timeout") {
publish->set("normal_timeout", sdir->dumps_arg0_to_number());
}
}
}
// refer
@ -2702,9 +2678,8 @@ int SrsConfig::check_config()
&& n != "time_jitter" && n != "mix_correct"
&& n != "atc" && n != "atc_auto"
&& n != "debug_srs_upnode"
&& n != "mr" && n != "mw_latency" && n != "min_latency"
&& n != "publish" && n != "mw_latency" && n != "min_latency"
&& n != "tcp_nodelay" && n != "send_min_interval" && n != "reduce_sequence_header"
&& n != "publish_1stpkt_timeout" && n != "publish_normal_timeout"
&& n != "security" && n != "http_remux"
&& n != "http_static" && n != "hds" && n != "exec"
) {
@ -2742,12 +2717,12 @@ int SrsConfig::check_config()
return ret;
}
}
} else if (n == "mr") {
} else if (n == "publish") {
for (int j = 0; j < (int)conf->directives.size(); j++) {
string m = conf->at(j)->name.c_str();
if (m != "enabled" && m != "latency") {
if (m != "mr" && m != "mr_latency" && m != "firstpkt_timeout" && m != "normal_timeout") {
ret = ERROR_SYSTEM_CONFIG_INVALID;
srs_error("unsupported vhost mr directive %s, ret=%d", m.c_str(), ret);
srs_error("unsupported vhost publish directive %s, ret=%d", m.c_str(), ret);
return ret;
}
}
@ -3463,12 +3438,12 @@ bool SrsConfig::get_mr_enabled(string vhost)
return SRS_PERF_MR_ENABLED;
}
conf = conf->get("mr");
conf = conf->get("publish");
if (!conf) {
return SRS_PERF_MR_ENABLED;
}
conf = conf->get("enabled");
conf = conf->get("mr");
if (!conf || conf->arg0().empty()) {
return SRS_PERF_MR_ENABLED;
}
@ -3483,12 +3458,12 @@ int SrsConfig::get_mr_sleep_ms(string vhost)
return SRS_PERF_MR_SLEEP;
}
conf = conf->get("mr");
conf = conf->get("publish");
if (!conf) {
return SRS_PERF_MR_SLEEP;
}
conf = conf->get("latency");
conf = conf->get("mr_latency");
if (!conf || conf->arg0().empty()) {
return SRS_PERF_MR_SLEEP;
}
@ -3587,7 +3562,12 @@ int SrsConfig::get_publish_1stpkt_timeout(string vhost)
return DEFAULT;
}
conf = conf->get("publish_1stpkt_timeout");
conf = conf->get("publish");
if (!conf) {
return DEFAULT;
}
conf = conf->get("firstpkt_timeout");
if (!conf || conf->arg0().empty()) {
return DEFAULT;
}
@ -3607,7 +3587,12 @@ int SrsConfig::get_publish_normal_timeout(string vhost)
return DEFAULT;
}
conf = conf->get("publish_normal_timeout");
conf = conf->get("publish");
if (!conf) {
return DEFAULT;
}
conf = conf->get("normal_timeout");
if (!conf || conf->arg0().empty()) {
return DEFAULT;
}
@ -5677,7 +5662,7 @@ int srs_config_transform_vhost(SrsConfDirective* root)
{
int ret = ERROR_SUCCESS;
for (int i = 0; i < root->directives.size(); i++) {
for (int i = 0; i < (int)root->directives.size(); i++) {
SrsConfDirective* dir = root->directives.at(i);
// SRS2.0, rename global http_stream to http_server.
@ -5694,6 +5679,7 @@ int srs_config_transform_vhost(SrsConfDirective* root)
continue;
}
// for each directive of vhost.
std::vector<SrsConfDirective*>::iterator it;
for (it = dir->directives.begin(); it != dir->directives.end();) {
SrsConfDirective* conf = *it;
@ -5736,6 +5722,66 @@ int srs_config_transform_vhost(SrsConfDirective* root)
continue;
}
// SRS3.0, change the mr style
// SRS2:
// vhost { mr { enabled; latency; } }
// SRS3+:
// vhost { publish { mr; mr_latency; } }
if (conf->name == "mr") {
it = dir->directives.erase(it);
SrsConfDirective* publish = dir->get_or_create("publish");
SrsConfDirective* enabled = conf->get("enabled");
if (enabled) {
SrsConfDirective* mr = publish->get_or_create("mr");
mr->args = enabled->args;
}
SrsConfDirective* latency = conf->get("latency");
if (latency) {
SrsConfDirective* mr_latency = publish->get_or_create("mr_latency");
mr_latency->args = latency->args;
}
srs_freep(conf);
continue;
}
// SRS3.0, change the publish_1stpkt_timeout
// SRS2:
// vhost { publish_1stpkt_timeout; }
// SRS3+:
// vhost { publish { firstpkt_timeout; } }
if (conf->name == "publish_1stpkt_timeout") {
it = dir->directives.erase(it);
SrsConfDirective* publish = dir->get_or_create("publish");
SrsConfDirective* firstpkt_timeout = publish->get_or_create("firstpkt_timeout");
firstpkt_timeout->args = conf->args;
srs_freep(conf);
continue;
}
// SRS3.0, change the publish_normal_timeout
// SRS2:
// vhost { publish_normal_timeout; }
// SRS3+:
// vhost { publish { normal_timeout; } }
if (conf->name == "publish_normal_timeout") {
it = dir->directives.erase(it);
SrsConfDirective* publish = dir->get_or_create("publish");
SrsConfDirective* normal_timeout = publish->get_or_create("normal_timeout");
normal_timeout->args = conf->args;
srs_freep(conf);
continue;
}
++it;
}
}

View file

@ -424,7 +424,7 @@ void SrsPublishRecvThread::on_read(ssize_t nread)
}
#endif
int SrsPublishRecvThread::on_reload_vhost_mr(string vhost)
int SrsPublishRecvThread::on_reload_vhost_publish(string vhost)
{
int ret = ERROR_SUCCESS;

View file

@ -206,7 +206,7 @@ public:
#endif
// interface ISrsReloadHandler
public:
virtual int on_reload_vhost_mr(std::string vhost);
virtual int on_reload_vhost_publish(std::string vhost);
virtual int on_reload_vhost_realtime(std::string vhost);
private:
virtual void set_socket_buffer(int sleep_ms);

View file

@ -170,7 +170,7 @@ int ISrsReloadHandler::on_reload_vhost_dvr(string /*vhost*/)
return ERROR_SUCCESS;
}
int ISrsReloadHandler::on_reload_vhost_mr(string /*vhost*/)
int ISrsReloadHandler::on_reload_vhost_publish(string /*vhost*/)
{
return ERROR_SUCCESS;
}
@ -195,16 +195,6 @@ int ISrsReloadHandler::on_reload_vhost_realtime(string /*vhost*/)
return ERROR_SUCCESS;
}
int ISrsReloadHandler::on_reload_vhost_p1stpt(string /*vhost*/)
{
return ERROR_SUCCESS;
}
int ISrsReloadHandler::on_reload_vhost_pnt(string /*vhost*/)
{
return ERROR_SUCCESS;
}
int ISrsReloadHandler::on_reload_vhost_chunk_size(string /*vhost*/)
{
return ERROR_SUCCESS;

View file

@ -73,13 +73,11 @@ public:
virtual int on_reload_vhost_hls(std::string vhost);
virtual int on_reload_vhost_hds(std::string vhost);
virtual int on_reload_vhost_dvr(std::string vhost);
virtual int on_reload_vhost_mr(std::string vhost);
virtual int on_reload_vhost_publish(std::string vhost);
virtual int on_reload_vhost_mw(std::string vhost);
virtual int on_reload_vhost_smi(std::string vhost);
virtual int on_reload_vhost_tcp_nodelay(std::string vhost);
virtual int on_reload_vhost_realtime(std::string vhost);
virtual int on_reload_vhost_p1stpt(std::string vhost);
virtual int on_reload_vhost_pnt(std::string vhost);
virtual int on_reload_vhost_chunk_size(std::string vhost);
virtual int on_reload_vhost_transcode(std::string vhost);
virtual int on_reload_vhost_exec(std::string vhost);

View file

@ -294,7 +294,7 @@ int SrsRtmpConn::on_reload_vhost_realtime(string vhost)
return ret;
}
int SrsRtmpConn::on_reload_vhost_p1stpt(string vhost)
int SrsRtmpConn::on_reload_vhost_publish(string vhost)
{
int ret = ERROR_SUCCESS;
@ -308,20 +308,9 @@ int SrsRtmpConn::on_reload_vhost_p1stpt(string vhost)
publish_1stpkt_timeout = p1stpt;
}
return ret;
}
int SrsRtmpConn::on_reload_vhost_pnt(string vhost)
{
int ret = ERROR_SUCCESS;
if (req->vhost != vhost) {
return ret;
}
int pnt = _srs_config->get_publish_normal_timeout(req->vhost);
if (pnt != publish_normal_timeout) {
srs_trace("p1stpt changed %d=>%d", publish_normal_timeout, pnt);
srs_trace("pnt changed %d=>%d", publish_normal_timeout, pnt);
publish_normal_timeout = pnt;
}

View file

@ -107,8 +107,7 @@ public:
virtual int on_reload_vhost_smi(std::string vhost);
virtual int on_reload_vhost_tcp_nodelay(std::string vhost);
virtual int on_reload_vhost_realtime(std::string vhost);
virtual int on_reload_vhost_p1stpt(std::string vhost);
virtual int on_reload_vhost_pnt(std::string vhost);
virtual int on_reload_vhost_publish(std::string vhost);
// interface IKbpsDelta
public:
virtual void resample();