winlin

Merge branch 'srs.master'

@@ -69,9 +69,6 @@ using namespace std; @@ -69,9 +69,6 @@ using namespace std;
69 // when edge timeout, retry next. 69 // when edge timeout, retry next.
70 #define SRS_EDGE_TOKEN_TRAVERSE_TIMEOUT_US (int64_t)(3*1000*1000LL) 70 #define SRS_EDGE_TOKEN_TRAVERSE_TIMEOUT_US (int64_t)(3*1000*1000LL)
71 71
72 -// to get msgs then totally send out.  
73 -#define SYS_MAX_PLAY_SEND_MSGS 128  
74 -  
75 SrsRtmpConn::SrsRtmpConn(SrsServer* srs_server, st_netfd_t client_stfd) 72 SrsRtmpConn::SrsRtmpConn(SrsServer* srs_server, st_netfd_t client_stfd)
76 : SrsConnection(srs_server, client_stfd) 73 : SrsConnection(srs_server, client_stfd)
77 { 74 {
@@ -520,7 +517,7 @@ int SrsRtmpConn::playing(SrsSource* source) @@ -520,7 +517,7 @@ int SrsRtmpConn::playing(SrsSource* source)
520 517
521 // initialize other components 518 // initialize other components
522 SrsPithyPrint pithy_print(SRS_CONSTS_STAGE_PLAY_USER); 519 SrsPithyPrint pithy_print(SRS_CONSTS_STAGE_PLAY_USER);
523 - SrsSharedPtrMessageArray msgs(SYS_MAX_PLAY_SEND_MSGS); 520 + SrsSharedPtrMessageArray msgs(SYS_CONSTS_MAX_PLAY_SEND_MSGS);
524 bool user_specified_duration_to_stop = (req->duration > 0); 521 bool user_specified_duration_to_stop = (req->duration > 0);
525 int64_t starttime = -1; 522 int64_t starttime = -1;
526 523
@@ -50,12 +50,13 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -50,12 +50,13 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
50 50
51 #define SERVER_LISTEN_BACKLOG 512 51 #define SERVER_LISTEN_BACKLOG 512
52 52
53 -// system interval 53 +// system interval in ms,
54 // all resolution times should be times togother, 54 // all resolution times should be times togother,
55 // for example, system-time is 3(300ms), 55 // for example, system-time is 3(300ms),
56 // then rusage can be 3*x, for instance, 3*10=30(3s), 56 // then rusage can be 3*x, for instance, 3*10=30(3s),
57 // the meminfo canbe 30*x, for instance, 30*2=60(6s) 57 // the meminfo canbe 30*x, for instance, 30*2=60(6s)
58 // for performance refine, @see: https://github.com/winlinvip/simple-rtmp-server/issues/194 58 // for performance refine, @see: https://github.com/winlinvip/simple-rtmp-server/issues/194
  59 +// @remark, recomment to 1000ms.
59 #define SRS_SYS_CYCLE_INTERVAL 1000 60 #define SRS_SYS_CYCLE_INTERVAL 1000
60 61
61 // update time interval: 62 // update time interval:
@@ -216,7 +216,7 @@ int SrsMessageQueue::dump_packets(int max_count, SrsSharedPtrMessage** pmsgs, in @@ -216,7 +216,7 @@ int SrsMessageQueue::dump_packets(int max_count, SrsSharedPtrMessage** pmsgs, in
216 } else { 216 } else {
217 // erase some vector elements may cause memory copy, 217 // erase some vector elements may cause memory copy,
218 // maybe can use more efficient vector.swap to avoid copy. 218 // maybe can use more efficient vector.swap to avoid copy.
219 - // @remark for the pmsgs is big enough, for instance, SYS_MAX_PLAY_SEND_MSGS 128, 219 + // @remark for the pmsgs is big enough, for instance, SYS_CONSTS_MAX_PLAY_SEND_MSGS 128,
220 // the rtmp play client will get 128msgs once, so this branch rarely execute. 220 // the rtmp play client will get 128msgs once, so this branch rarely execute.
221 msgs.erase(msgs.begin(), msgs.begin() + count); 221 msgs.erase(msgs.begin(), msgs.begin() + count);
222 } 222 }
@@ -78,6 +78,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -78,6 +78,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
78 // the timeout to wait for client control message, 78 // the timeout to wait for client control message,
79 // if timeout, we generally ignore and send the data to client, 79 // if timeout, we generally ignore and send the data to client,
80 // generally, it's the pulse time for data seding. 80 // generally, it's the pulse time for data seding.
  81 +// @remark, recomment to 500ms.
81 #define SRS_CONSTS_RTMP_PULSE_TIMEOUT_US (int64_t)(500*1000LL) 82 #define SRS_CONSTS_RTMP_PULSE_TIMEOUT_US (int64_t)(500*1000LL)
82 83
83 /** 84 /**
@@ -98,17 +99,41 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -98,17 +99,41 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
98 //#define SRS_CONSTS_RTMP_MAX_FMT3_HEADER_SIZE 5 99 //#define SRS_CONSTS_RTMP_MAX_FMT3_HEADER_SIZE 5
99 100
100 /** 101 /**
  102 +* how many msgs can be send entirely.
  103 +* for play clients to get msgs then totally send out.
  104 +* for example, 25fps video, 40ms per video packet,
  105 +* while audio is 20ms per audio packet where 2/3 is audios,
  106 +* when SYS_CONSTS_MAX_PLAY_SEND_MSGS is 128, then
  107 +* we will send all 128*40ms/3=1706ms packets in a time,
  108 +* which should greater than the SRS_CONSTS_RTMP_PULSE_TIMEOUT_US
  109 +* (for example, 500ms), that is, we should:
  110 +* SYS_CONSTS_MAX_PLAY_SEND_MSGS * 40 / 3 >= SRS_CONSTS_RTMP_PULSE_TIMEOUT_US
  111 +* @remark, recomment to 128.
  112 +*/
  113 +#define SYS_CONSTS_MAX_PLAY_SEND_MSGS 128
  114 +/**
101 * for performance issue, 115 * for performance issue,
102 * the iovs cache, @see https://github.com/winlinvip/simple-rtmp-server/issues/194 116 * the iovs cache, @see https://github.com/winlinvip/simple-rtmp-server/issues/194
103 * iovs cache for multiple messages for each connections. 117 * iovs cache for multiple messages for each connections.
  118 +* each iovc is 16bytes, sizeof(iovec)=16, suppose the chunk size is 64k,
  119 +* each message send in a chunk which needs only 2 iovec,
  120 +* so the iovs max should be (SYS_CONSTS_MAX_PLAY_SEND_MSGS * 16 * 2)
  121 +*
  122 +* @remark, SRS will realloc when the iovs not enough.
104 */ 123 */
105 -#define SRS_CONSTS_IOVS_MAX 1024 124 +#define SRS_CONSTS_IOVS_MAX (SYS_CONSTS_MAX_PLAY_SEND_MSGS * 32)
106 /** 125 /**
107 * for performance issue, 126 * for performance issue,
108 * the c0c3 cache, @see https://github.com/winlinvip/simple-rtmp-server/issues/194 127 * the c0c3 cache, @see https://github.com/winlinvip/simple-rtmp-server/issues/194
109 * c0c3 cache for multiple messages for each connections. 128 * c0c3 cache for multiple messages for each connections.
  129 +* each c0 <= 16byes, suppose the chunk size is 64k,
  130 +* each message send in a chunk which needs only a c0 header,
  131 +* so the c0c3 cache should be (SYS_CONSTS_MAX_PLAY_SEND_MSGS * 16)
  132 +*
  133 +* @remark, SRS will try another loop when c0c3 cache dry, for we cannot realloc it.
  134 +* so we use larger c0c3 cache, that is (SYS_CONSTS_MAX_PLAY_SEND_MSGS * 32)
110 */ 135 */
111 -#define SRS_CONSTS_C0C3_HEADERS_MAX 4096 136 +#define SRS_CONSTS_C0C3_HEADERS_MAX (SYS_CONSTS_MAX_PLAY_SEND_MSGS * 32)
112 137
113 /////////////////////////////////////////////////////////// 138 ///////////////////////////////////////////////////////////
114 /////////////////////////////////////////////////////////// 139 ///////////////////////////////////////////////////////////
@@ -374,6 +374,9 @@ public: @@ -374,6 +374,9 @@ public:
374 * @param msgs, the msgs to send out, never be NULL. 374 * @param msgs, the msgs to send out, never be NULL.
375 * @param nb_msgs, the size of msgs to send out. 375 * @param nb_msgs, the size of msgs to send out.
376 * @param stream_id, the stream id of packet to send over, 0 for control message. 376 * @param stream_id, the stream id of packet to send over, 0 for control message.
  377 + *
  378 + * @remark performance issue, to support 6k+ 250kbps client,
  379 + * @see https://github.com/winlinvip/simple-rtmp-server/issues/194
377 */ 380 */
378 virtual int send_and_free_messages(SrsSharedPtrMessage** msgs, int nb_msgs, int stream_id); 381 virtual int send_and_free_messages(SrsSharedPtrMessage** msgs, int nb_msgs, int stream_id);
379 /** 382 /**