mirror of
				https://github.com/ossrs/srs.git
				synced 2025-03-09 15:49:59 +00:00 
			
		
		
		
	Merge remote-tracking branch 'winlin/feature/perf_stat' into feature/rtc
This commit is contained in:
		
						commit
						40c95b04ca
					
				
					 9 changed files with 335 additions and 7 deletions
				
			
		| 
						 | 
				
			
			@ -217,6 +217,14 @@ srs_error_t SrsPacket::encode_packet(SrsBuffer* stream)
 | 
			
		|||
    return srs_error_new(ERROR_SYSTEM_PACKET_INVALID, "encode");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ISrsProtocolPerf::ISrsProtocolPerf()
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ISrsProtocolPerf::~ISrsProtocolPerf()
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
SrsProtocol::AckWindowSize::AckWindowSize()
 | 
			
		||||
{
 | 
			
		||||
    window = 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -256,6 +264,7 @@ SrsProtocol::SrsProtocol(ISrsProtocolReadWriter* io)
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    out_c0c3_caches = new char[SRS_CONSTS_C0C3_HEADERS_MAX];
 | 
			
		||||
    perf = NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
SrsProtocol::~SrsProtocol()
 | 
			
		||||
| 
						 | 
				
			
			@ -303,6 +312,11 @@ void SrsProtocol::set_auto_response(bool v)
 | 
			
		|||
    auto_response_when_recv = v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SrsProtocol::set_perf(ISrsProtocolPerf* v)
 | 
			
		||||
{
 | 
			
		||||
    perf = v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
srs_error_t SrsProtocol::manual_response_flush()
 | 
			
		||||
{
 | 
			
		||||
    srs_error_t err = srs_success;
 | 
			
		||||
| 
						 | 
				
			
			@ -448,7 +462,12 @@ srs_error_t SrsProtocol::do_send_messages(SrsSharedPtrMessage** msgs, int nb_msg
 | 
			
		|||
    
 | 
			
		||||
    int c0c3_cache_index = 0;
 | 
			
		||||
    char* c0c3_cache = out_c0c3_caches + c0c3_cache_index;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    // How many messages are merged in written.
 | 
			
		||||
    int nb_msgs_merged_written = 0;
 | 
			
		||||
    // How many bytes of messages are merged in written.
 | 
			
		||||
    int bytes_msgs_merged_written = 0;
 | 
			
		||||
 | 
			
		||||
    // try to send use the c0c3 header cache,
 | 
			
		||||
    // if cache is consumed, try another loop.
 | 
			
		||||
    for (int i = 0; i < nb_msgs; i++) {
 | 
			
		||||
| 
						 | 
				
			
			@ -462,6 +481,10 @@ srs_error_t SrsProtocol::do_send_messages(SrsSharedPtrMessage** msgs, int nb_msg
 | 
			
		|||
        if (!msg->payload || msg->size <= 0) {
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Increase the perf stat data.
 | 
			
		||||
        nb_msgs_merged_written++;
 | 
			
		||||
        bytes_msgs_merged_written += msg->size;
 | 
			
		||||
        
 | 
			
		||||
        // p set to current write position,
 | 
			
		||||
        // it's ok when payload is NULL and size is 0.
 | 
			
		||||
| 
						 | 
				
			
			@ -522,6 +545,12 @@ srs_error_t SrsProtocol::do_send_messages(SrsSharedPtrMessage** msgs, int nb_msg
 | 
			
		|||
                if ((err = do_iovs_send(out_iovs, iov_index)) != srs_success) {
 | 
			
		||||
                    return srs_error_wrap(err, "send iovs");
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // Notify about perf stat.
 | 
			
		||||
                if (perf) {
 | 
			
		||||
                    perf->perf_mw_on_msgs(nb_msgs_merged_written, bytes_msgs_merged_written, iov_index);
 | 
			
		||||
                    nb_msgs_merged_written = 0; bytes_msgs_merged_written = 0;
 | 
			
		||||
                }
 | 
			
		||||
                
 | 
			
		||||
                // reset caches, while these cache ensure
 | 
			
		||||
                // atleast we can sendout a chunk.
 | 
			
		||||
| 
						 | 
				
			
			@ -539,8 +568,19 @@ srs_error_t SrsProtocol::do_send_messages(SrsSharedPtrMessage** msgs, int nb_msg
 | 
			
		|||
    if (iov_index <= 0) {
 | 
			
		||||
        return err;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    return do_iovs_send(out_iovs, iov_index);
 | 
			
		||||
 | 
			
		||||
    // Send out iovs at a time.
 | 
			
		||||
    if ((err = do_iovs_send(out_iovs, iov_index)) != srs_success) {
 | 
			
		||||
        return srs_error_wrap(err, "send iovs");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Notify about perf stat.
 | 
			
		||||
    if (perf) {
 | 
			
		||||
        perf->perf_mw_on_msgs(nb_msgs_merged_written, bytes_msgs_merged_written, iov_index);
 | 
			
		||||
        nb_msgs_merged_written = 0; bytes_msgs_merged_written = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return err;
 | 
			
		||||
#else
 | 
			
		||||
    // try to send use the c0c3 header cache,
 | 
			
		||||
    // if cache is consumed, try another loop.
 | 
			
		||||
| 
						 | 
				
			
			@ -587,6 +627,11 @@ srs_error_t SrsProtocol::do_send_messages(SrsSharedPtrMessage** msgs, int nb_msg
 | 
			
		|||
            if ((er = skt->writev(iovs, 2, NULL)) != srs_success) {
 | 
			
		||||
                return srs_error_wrap(err, "writev");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Notify about perf stat.
 | 
			
		||||
            if (perf) {
 | 
			
		||||
                perf->perf_mw_on_packets(1, payload_size, 2);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
| 
						 | 
				
			
			@ -2209,6 +2254,11 @@ void SrsRtmpServer::set_auto_response(bool v)
 | 
			
		|||
    protocol->set_auto_response(v);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SrsRtmpServer::set_perf(ISrsProtocolPerf* v)
 | 
			
		||||
{
 | 
			
		||||
    protocol->set_perf(v);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef SRS_PERF_MERGED_READ
 | 
			
		||||
void SrsRtmpServer::set_merge_read(bool v, IMergeReadHandler* handler)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -147,6 +147,21 @@ protected:
 | 
			
		|||
    virtual srs_error_t encode_packet(SrsBuffer* stream);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// The performance statistic data collect.
 | 
			
		||||
class ISrsProtocolPerf
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    ISrsProtocolPerf();
 | 
			
		||||
    virtual ~ISrsProtocolPerf();
 | 
			
		||||
public:
 | 
			
		||||
    // Stat for packets merged written, nb_msgs is the number of RTMP messages,
 | 
			
		||||
    // bytes_msgs is the total bytes of RTMP messages, nb_iovs is the total number of iovec.
 | 
			
		||||
    virtual void perf_mw_on_msgs(int nb_msgs, int bytes_msgs, int nb_iovs) = 0;
 | 
			
		||||
    // Stat for packets merged written, nb_pkts is the number of or chunk packets,
 | 
			
		||||
    // bytes_pkts is the total bytes of or chunk packets, nb_iovs is the total number of iovec.
 | 
			
		||||
    virtual void perf_mw_on_packets(int nb_pkts, int bytes_pkts, int nb_iovs) = 0;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// The protocol provides the rtmp-message-protocol services,
 | 
			
		||||
// To recv RTMP message from RTMP chunk stream,
 | 
			
		||||
// and to send out RTMP message over RTMP chunk stream.
 | 
			
		||||
| 
						 | 
				
			
			@ -168,6 +183,8 @@ private:
 | 
			
		|||
private:
 | 
			
		||||
    // The underlayer socket object, send/recv bytes.
 | 
			
		||||
    ISrsProtocolReadWriter* skt;
 | 
			
		||||
    // The performance stat handler.
 | 
			
		||||
    ISrsProtocolPerf* perf;
 | 
			
		||||
    // The requests sent out, used to build the response.
 | 
			
		||||
    // key: transactionId
 | 
			
		||||
    // value: the request command name
 | 
			
		||||
| 
						 | 
				
			
			@ -227,6 +244,8 @@ public:
 | 
			
		|||
    // @param v, whether auto response message when recv message.
 | 
			
		||||
    // @see: https://github.com/ossrs/srs/issues/217
 | 
			
		||||
    virtual void set_auto_response(bool v);
 | 
			
		||||
    // Set the performance stat handler.
 | 
			
		||||
    virtual void set_perf(ISrsProtocolPerf* v);
 | 
			
		||||
    // Flush for manual response when the auto response is disabled
 | 
			
		||||
    // by set_auto_response(false), we default use auto response, so donot
 | 
			
		||||
    // need to call this api(the protocol sdk will auto send message).
 | 
			
		||||
| 
						 | 
				
			
			@ -631,6 +650,8 @@ public:
 | 
			
		|||
    // @param v, whether auto response message when recv message.
 | 
			
		||||
    // @see: https://github.com/ossrs/srs/issues/217
 | 
			
		||||
    virtual void set_auto_response(bool v);
 | 
			
		||||
    // Set the performance stat handler.
 | 
			
		||||
    virtual void set_perf(ISrsProtocolPerf* v);
 | 
			
		||||
#ifdef SRS_PERF_MERGED_READ
 | 
			
		||||
    // To improve read performance, merge some packets then read,
 | 
			
		||||
    // When it on and read small bytes, we sleep to wait more data.,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue