for bug #251, use macro to define the fast cache and cond wait. 2.0.58
正在显示
5 个修改的文件
包含
107 行增加
和
1 行删除
@@ -598,9 +598,11 @@ int SrsRtmpConn::do_playing(SrsSource* source, SrsQueueRecvThread* trd) | @@ -598,9 +598,11 @@ int SrsRtmpConn::do_playing(SrsSource* source, SrsQueueRecvThread* trd) | ||
598 | // collect elapse for pithy print. | 598 | // collect elapse for pithy print. |
599 | pithy_print.elapse(); | 599 | pithy_print.elapse(); |
600 | 600 | ||
601 | +#ifdef SRS_PERF_QUEUE_COND_WAIT | ||
601 | // wait for message to incoming. | 602 | // wait for message to incoming. |
602 | // @see https://github.com/winlinvip/simple-rtmp-server/issues/251 | 603 | // @see https://github.com/winlinvip/simple-rtmp-server/issues/251 |
603 | consumer->wait(SRS_PERF_MW_MIN_MSGS, mw_sleep); | 604 | consumer->wait(SRS_PERF_MW_MIN_MSGS, mw_sleep); |
605 | +#endif | ||
604 | 606 | ||
605 | // get messages from consumer. | 607 | // get messages from consumer. |
606 | // each msg in msgs.msgs must be free, for the SrsMessageArray never free them. | 608 | // each msg in msgs.msgs must be free, for the SrsMessageArray never free them. |
@@ -610,8 +612,14 @@ int SrsRtmpConn::do_playing(SrsSource* source, SrsQueueRecvThread* trd) | @@ -610,8 +612,14 @@ int SrsRtmpConn::do_playing(SrsSource* source, SrsQueueRecvThread* trd) | ||
610 | return ret; | 612 | return ret; |
611 | } | 613 | } |
612 | 614 | ||
615 | +#ifdef SRS_PERF_QUEUE_COND_WAIT | ||
613 | // we use wait to get messages, so the count must be positive. | 616 | // we use wait to get messages, so the count must be positive. |
614 | srs_assert(count > 0); | 617 | srs_assert(count > 0); |
618 | +#else | ||
619 | + if (count <= 0) { | ||
620 | + st_usleep(mw_sleep * 1000); | ||
621 | + } | ||
622 | +#endif | ||
615 | srs_info("got %d msgs, min=%d, mw=%d", count, SRS_PERF_MW_MIN_MSGS, mw_sleep); | 623 | srs_info("got %d msgs, min=%d, mw=%d", count, SRS_PERF_MW_MIN_MSGS, mw_sleep); |
616 | 624 | ||
617 | // reportable | 625 | // reportable |
@@ -167,6 +167,16 @@ SrsMessageQueue::~SrsMessageQueue() | @@ -167,6 +167,16 @@ SrsMessageQueue::~SrsMessageQueue() | ||
167 | clear(); | 167 | clear(); |
168 | } | 168 | } |
169 | 169 | ||
170 | +int SrsMessageQueue::size() | ||
171 | +{ | ||
172 | + return (int)msgs.size(); | ||
173 | +} | ||
174 | + | ||
175 | +int SrsMessageQueue::duration() | ||
176 | +{ | ||
177 | + return (int)(av_end_time - av_start_time); | ||
178 | +} | ||
179 | + | ||
170 | void SrsMessageQueue::set_queue_size(double queue_size) | 180 | void SrsMessageQueue::set_queue_size(double queue_size) |
171 | { | 181 | { |
172 | queue_size_ms = (int)(queue_size * 1000); | 182 | queue_size_ms = (int)(queue_size * 1000); |
@@ -297,28 +307,37 @@ SrsConsumer::SrsConsumer(SrsSource* _source) | @@ -297,28 +307,37 @@ SrsConsumer::SrsConsumer(SrsSource* _source) | ||
297 | queue = new SrsMessageQueue(); | 307 | queue = new SrsMessageQueue(); |
298 | should_update_source_id = false; | 308 | should_update_source_id = false; |
299 | 309 | ||
310 | +#ifdef SRS_PERF_QUEUE_COND_WAIT | ||
300 | mw_wait = st_cond_new(); | 311 | mw_wait = st_cond_new(); |
301 | mw_min_msgs = 0; | 312 | mw_min_msgs = 0; |
302 | mw_duration = 0; | 313 | mw_duration = 0; |
303 | mw_waiting = false; | 314 | mw_waiting = false; |
315 | +#endif | ||
304 | 316 | ||
317 | +#ifdef SRS_PERF_QUEUE_FAST_CACHE | ||
305 | mw_cache = new SrsMessageArray(SRS_PERF_MW_MSGS); | 318 | mw_cache = new SrsMessageArray(SRS_PERF_MW_MSGS); |
306 | mw_count = 0; | 319 | mw_count = 0; |
307 | mw_first_pkt = mw_last_pkt = 0; | 320 | mw_first_pkt = mw_last_pkt = 0; |
321 | +#endif | ||
308 | } | 322 | } |
309 | 323 | ||
310 | SrsConsumer::~SrsConsumer() | 324 | SrsConsumer::~SrsConsumer() |
311 | { | 325 | { |
326 | +#ifdef SRS_PERF_QUEUE_FAST_CACHE | ||
312 | if (mw_cache) { | 327 | if (mw_cache) { |
313 | mw_cache->free(mw_count); | 328 | mw_cache->free(mw_count); |
314 | mw_count = 0; | 329 | mw_count = 0; |
315 | } | 330 | } |
316 | srs_freep(mw_cache); | 331 | srs_freep(mw_cache); |
332 | +#endif | ||
317 | 333 | ||
318 | source->on_consumer_destroy(this); | 334 | source->on_consumer_destroy(this); |
319 | srs_freep(jitter); | 335 | srs_freep(jitter); |
320 | srs_freep(queue); | 336 | srs_freep(queue); |
337 | + | ||
338 | +#ifdef SRS_PERF_QUEUE_COND_WAIT | ||
321 | st_cond_destroy(mw_wait); | 339 | st_cond_destroy(mw_wait); |
340 | +#endif | ||
322 | } | 341 | } |
323 | 342 | ||
324 | void SrsConsumer::set_queue_size(double queue_size) | 343 | void SrsConsumer::set_queue_size(double queue_size) |
@@ -347,6 +366,7 @@ int SrsConsumer::enqueue(SrsSharedPtrMessage* msg, bool atc, int tba, int tbv, S | @@ -347,6 +366,7 @@ int SrsConsumer::enqueue(SrsSharedPtrMessage* msg, bool atc, int tba, int tbv, S | ||
347 | } | 366 | } |
348 | } | 367 | } |
349 | 368 | ||
369 | +#ifdef SRS_PERF_QUEUE_FAST_CACHE | ||
350 | // use fast cache if available | 370 | // use fast cache if available |
351 | if (mw_count < mw_cache->max) { | 371 | if (mw_count < mw_cache->max) { |
352 | // update fast cache timestamps | 372 | // update fast cache timestamps |
@@ -371,6 +391,7 @@ int SrsConsumer::enqueue(SrsSharedPtrMessage* msg, bool atc, int tba, int tbv, S | @@ -371,6 +391,7 @@ int SrsConsumer::enqueue(SrsSharedPtrMessage* msg, bool atc, int tba, int tbv, S | ||
371 | } | 391 | } |
372 | } | 392 | } |
373 | 393 | ||
394 | + #ifdef SRS_PERF_QUEUE_COND_WAIT | ||
374 | // fire the mw when msgs is enough. | 395 | // fire the mw when msgs is enough. |
375 | if (mw_waiting) { | 396 | if (mw_waiting) { |
376 | // when fast cache not overflow, always flush. | 397 | // when fast cache not overflow, always flush. |
@@ -385,6 +406,26 @@ int SrsConsumer::enqueue(SrsSharedPtrMessage* msg, bool atc, int tba, int tbv, S | @@ -385,6 +406,26 @@ int SrsConsumer::enqueue(SrsSharedPtrMessage* msg, bool atc, int tba, int tbv, S | ||
385 | mw_waiting = false; | 406 | mw_waiting = false; |
386 | } | 407 | } |
387 | } | 408 | } |
409 | + #endif | ||
410 | +#else | ||
411 | + if ((ret = queue->enqueue(msg, NULL)) != ERROR_SUCCESS) { | ||
412 | + return ret; | ||
413 | + } | ||
414 | + | ||
415 | + #ifdef SRS_PERF_QUEUE_COND_WAIT | ||
416 | + // fire the mw when msgs is enough. | ||
417 | + if (mw_waiting) { | ||
418 | + int duration_ms = queue->duration(); | ||
419 | + bool match_min_msgs = queue->size() > mw_min_msgs; | ||
420 | + | ||
421 | + // when duration ok, signal to flush. | ||
422 | + if (match_min_msgs && duration_ms > mw_duration) { | ||
423 | + st_cond_signal(mw_wait); | ||
424 | + mw_waiting = false; | ||
425 | + } | ||
426 | + } | ||
427 | + #endif | ||
428 | +#endif | ||
388 | 429 | ||
389 | return ret; | 430 | return ret; |
390 | } | 431 | } |
@@ -405,6 +446,7 @@ int SrsConsumer::dump_packets(SrsMessageArray* msgs, int* count) | @@ -405,6 +446,7 @@ int SrsConsumer::dump_packets(SrsMessageArray* msgs, int* count) | ||
405 | return ret; | 446 | return ret; |
406 | } | 447 | } |
407 | 448 | ||
449 | +#ifdef SRS_PERF_QUEUE_FAST_CACHE | ||
408 | // only dumps an whole array to msgs. | 450 | // only dumps an whole array to msgs. |
409 | for (int i = 0; i < mw_count; i++) { | 451 | for (int i = 0; i < mw_count; i++) { |
410 | msgs->msgs[i] = mw_cache->msgs[i]; | 452 | msgs->msgs[i] = mw_cache->msgs[i]; |
@@ -420,13 +462,26 @@ int SrsConsumer::dump_packets(SrsMessageArray* msgs, int* count) | @@ -420,13 +462,26 @@ int SrsConsumer::dump_packets(SrsMessageArray* msgs, int* count) | ||
420 | } | 462 | } |
421 | 463 | ||
422 | return dumps_queue_to_fast_cache(); | 464 | return dumps_queue_to_fast_cache(); |
465 | +#else | ||
466 | + | ||
467 | + // pump msgs from queue. | ||
468 | + int nb_msgs = 0; | ||
469 | + if ((ret = queue->dump_packets(msgs->max, msgs->msgs, nb_msgs)) != ERROR_SUCCESS) { | ||
470 | + return ret; | ||
471 | + } | ||
472 | + *count = nb_msgs; | ||
473 | + | ||
474 | + return ret; | ||
475 | +#endif | ||
423 | } | 476 | } |
424 | 477 | ||
478 | +#ifdef SRS_PERF_QUEUE_COND_WAIT | ||
425 | void SrsConsumer::wait(int nb_msgs, int duration) | 479 | void SrsConsumer::wait(int nb_msgs, int duration) |
426 | { | 480 | { |
427 | mw_min_msgs = nb_msgs; | 481 | mw_min_msgs = nb_msgs; |
428 | mw_duration = duration; | 482 | mw_duration = duration; |
429 | 483 | ||
484 | +#ifdef SRS_PERF_QUEUE_FAST_CACHE | ||
430 | // when fast cache not overflow, always flush. | 485 | // when fast cache not overflow, always flush. |
431 | // so we donot care about the queue. | 486 | // so we donot care about the queue. |
432 | bool fast_cache_overflow = mw_count >= mw_cache->max; | 487 | bool fast_cache_overflow = mw_count >= mw_cache->max; |
@@ -437,12 +492,22 @@ void SrsConsumer::wait(int nb_msgs, int duration) | @@ -437,12 +492,22 @@ void SrsConsumer::wait(int nb_msgs, int duration) | ||
437 | if (fast_cache_overflow || (match_min_msgs && duration_ms > mw_duration)) { | 492 | if (fast_cache_overflow || (match_min_msgs && duration_ms > mw_duration)) { |
438 | return; | 493 | return; |
439 | } | 494 | } |
495 | +#else | ||
496 | + int duration_ms = queue->duration(); | ||
497 | + bool match_min_msgs = queue->size() > mw_min_msgs; | ||
498 | + | ||
499 | + // when duration ok, signal to flush. | ||
500 | + if (match_min_msgs && duration_ms > mw_duration) { | ||
501 | + return; | ||
502 | + } | ||
503 | +#endif | ||
440 | 504 | ||
441 | // the enqueue will notify this cond. | 505 | // the enqueue will notify this cond. |
442 | mw_waiting = true; | 506 | mw_waiting = true; |
443 | // wait for msgs to incoming. | 507 | // wait for msgs to incoming. |
444 | st_cond_wait(mw_wait); | 508 | st_cond_wait(mw_wait); |
445 | } | 509 | } |
510 | +#endif | ||
446 | 511 | ||
447 | int SrsConsumer::on_play_client_pause(bool is_pause) | 512 | int SrsConsumer::on_play_client_pause(bool is_pause) |
448 | { | 513 | { |
@@ -454,6 +519,7 @@ int SrsConsumer::on_play_client_pause(bool is_pause) | @@ -454,6 +519,7 @@ int SrsConsumer::on_play_client_pause(bool is_pause) | ||
454 | return ret; | 519 | return ret; |
455 | } | 520 | } |
456 | 521 | ||
522 | +#ifdef SRS_PERF_QUEUE_FAST_CACHE | ||
457 | int SrsConsumer::dumps_queue_to_fast_cache() | 523 | int SrsConsumer::dumps_queue_to_fast_cache() |
458 | { | 524 | { |
459 | int ret =ERROR_SUCCESS; | 525 | int ret =ERROR_SUCCESS; |
@@ -473,6 +539,7 @@ int SrsConsumer::dumps_queue_to_fast_cache() | @@ -473,6 +539,7 @@ int SrsConsumer::dumps_queue_to_fast_cache() | ||
473 | 539 | ||
474 | return ret; | 540 | return ret; |
475 | } | 541 | } |
542 | +#endif | ||
476 | 543 | ||
477 | SrsGopCache::SrsGopCache() | 544 | SrsGopCache::SrsGopCache() |
478 | { | 545 | { |
@@ -36,6 +36,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -36,6 +36,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
36 | 36 | ||
37 | #include <srs_app_st.hpp> | 37 | #include <srs_app_st.hpp> |
38 | #include <srs_app_reload.hpp> | 38 | #include <srs_app_reload.hpp> |
39 | +#include <srs_core_performance.hpp> | ||
39 | 40 | ||
40 | class SrsPlayEdge; | 41 | class SrsPlayEdge; |
41 | class SrsPublishEdge; | 42 | class SrsPublishEdge; |
@@ -117,6 +118,14 @@ public: | @@ -117,6 +118,14 @@ public: | ||
117 | virtual ~SrsMessageQueue(); | 118 | virtual ~SrsMessageQueue(); |
118 | public: | 119 | public: |
119 | /** | 120 | /** |
121 | + * get the size of queue. | ||
122 | + */ | ||
123 | + virtual int size(); | ||
124 | + /** | ||
125 | + * get the duration of queue. | ||
126 | + */ | ||
127 | + virtual int duration(); | ||
128 | + /** | ||
120 | * set the queue size | 129 | * set the queue size |
121 | * @param queue_size the queue size in seconds. | 130 | * @param queue_size the queue size in seconds. |
122 | */ | 131 | */ |
@@ -156,12 +165,15 @@ private: | @@ -156,12 +165,15 @@ private: | ||
156 | bool paused; | 165 | bool paused; |
157 | // when source id changed, notice all consumers | 166 | // when source id changed, notice all consumers |
158 | bool should_update_source_id; | 167 | bool should_update_source_id; |
168 | +#ifdef SRS_PERF_QUEUE_COND_WAIT | ||
159 | // the cond wait for mw. | 169 | // the cond wait for mw. |
160 | // @see https://github.com/winlinvip/simple-rtmp-server/issues/251 | 170 | // @see https://github.com/winlinvip/simple-rtmp-server/issues/251 |
161 | st_cond_t mw_wait; | 171 | st_cond_t mw_wait; |
162 | bool mw_waiting; | 172 | bool mw_waiting; |
163 | int mw_min_msgs; | 173 | int mw_min_msgs; |
164 | int mw_duration; | 174 | int mw_duration; |
175 | +#endif | ||
176 | +#ifdef SRS_PERF_QUEUE_FAST_CACHE | ||
165 | // use fast cache for msgs | 177 | // use fast cache for msgs |
166 | // @see https://github.com/winlinvip/simple-rtmp-server/issues/251 | 178 | // @see https://github.com/winlinvip/simple-rtmp-server/issues/251 |
167 | SrsMessageArray* mw_cache; | 179 | SrsMessageArray* mw_cache; |
@@ -170,6 +182,7 @@ private: | @@ -170,6 +182,7 @@ private: | ||
170 | // the packet time in fast cache. | 182 | // the packet time in fast cache. |
171 | int64_t mw_first_pkt; | 183 | int64_t mw_first_pkt; |
172 | int64_t mw_last_pkt; | 184 | int64_t mw_last_pkt; |
185 | +#endif | ||
173 | public: | 186 | public: |
174 | SrsConsumer(SrsSource* _source); | 187 | SrsConsumer(SrsSource* _source); |
175 | virtual ~SrsConsumer(); | 188 | virtual ~SrsConsumer(); |
@@ -204,22 +217,26 @@ public: | @@ -204,22 +217,26 @@ public: | ||
204 | * @max_count the max count to dequeue, must be positive. | 217 | * @max_count the max count to dequeue, must be positive. |
205 | */ | 218 | */ |
206 | virtual int dump_packets(SrsMessageArray* msgs, int* count); | 219 | virtual int dump_packets(SrsMessageArray* msgs, int* count); |
220 | +#ifdef SRS_PERF_QUEUE_COND_WAIT | ||
207 | /** | 221 | /** |
208 | * wait for messages incomming, atleast nb_msgs and in duration. | 222 | * wait for messages incomming, atleast nb_msgs and in duration. |
209 | * @param nb_msgs the messages count to wait. | 223 | * @param nb_msgs the messages count to wait. |
210 | * @param duration the messgae duration to wait. | 224 | * @param duration the messgae duration to wait. |
211 | */ | 225 | */ |
212 | virtual void wait(int nb_msgs, int duration); | 226 | virtual void wait(int nb_msgs, int duration); |
227 | +#endif | ||
213 | /** | 228 | /** |
214 | * when client send the pause message. | 229 | * when client send the pause message. |
215 | */ | 230 | */ |
216 | virtual int on_play_client_pause(bool is_pause); | 231 | virtual int on_play_client_pause(bool is_pause); |
217 | private: | 232 | private: |
233 | +#ifdef SRS_PERF_QUEUE_FAST_CACHE | ||
218 | /** | 234 | /** |
219 | * dumps the queue to fast cache, | 235 | * dumps the queue to fast cache, |
220 | * when fast cache is clear or queue is overflow. | 236 | * when fast cache is clear or queue is overflow. |
221 | */ | 237 | */ |
222 | virtual int dumps_queue_to_fast_cache(); | 238 | virtual int dumps_queue_to_fast_cache(); |
239 | +#endif | ||
223 | }; | 240 | }; |
224 | 241 | ||
225 | /** | 242 | /** |
@@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
31 | // current release version | 31 | // current release version |
32 | #define VERSION_MAJOR 2 | 32 | #define VERSION_MAJOR 2 |
33 | #define VERSION_MINOR 0 | 33 | #define VERSION_MINOR 0 |
34 | -#define VERSION_REVISION 57 | 34 | +#define VERSION_REVISION 58 |
35 | // server info. | 35 | // server info. |
36 | #define RTMP_SIG_SRS_KEY "SRS" | 36 | #define RTMP_SIG_SRS_KEY "SRS" |
37 | #define RTMP_SIG_SRS_ROLE "origin/edge server" | 37 | #define RTMP_SIG_SRS_ROLE "origin/edge server" |
@@ -110,6 +110,20 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -110,6 +110,20 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
110 | #define SRS_PERF_MW_MIN_MSGS 32 | 110 | #define SRS_PERF_MW_MIN_MSGS 32 |
111 | 111 | ||
112 | /** | 112 | /** |
113 | +* whether enable the fast cache. | ||
114 | +* @remark this improve performance for large connectios. | ||
115 | +* @remark this also introduce complex, default to disable it. | ||
116 | +* @see https://github.com/winlinvip/simple-rtmp-server/issues/251 | ||
117 | +*/ | ||
118 | +#undef SRS_PERF_QUEUE_FAST_CACHE | ||
119 | +/** | ||
120 | +* whether use cond wait to send messages. | ||
121 | +* @remark this improve performance for large connectios. | ||
122 | +* @see https://github.com/winlinvip/simple-rtmp-server/issues/251 | ||
123 | +*/ | ||
124 | +#undef SRS_PERF_QUEUE_COND_WAIT | ||
125 | + | ||
126 | +/** | ||
113 | * how many chunk stream to cache, [0, N]. | 127 | * how many chunk stream to cache, [0, N]. |
114 | * to imporove about 10% performance when chunk size small, and 5% for large chunk. | 128 | * to imporove about 10% performance when chunk size small, and 5% for large chunk. |
115 | * @see https://github.com/winlinvip/simple-rtmp-server/issues/249 | 129 | * @see https://github.com/winlinvip/simple-rtmp-server/issues/249 |
-
请 注册 或 登录 后发表评论