正在显示
6 个修改的文件
包含
188 行增加
和
21 行删除
@@ -172,9 +172,12 @@ int SrsEdgeIngester::ingest() | @@ -172,9 +172,12 @@ int SrsEdgeIngester::ingest() | ||
172 | 172 | ||
173 | // pithy print | 173 | // pithy print |
174 | if (pithy_print.can_print()) { | 174 | if (pithy_print.can_print()) { |
175 | + kbps->sample(); | ||
175 | srs_trace("<- "SRS_LOG_ID_EDGE_PLAY | 176 | srs_trace("<- "SRS_LOG_ID_EDGE_PLAY |
176 | - " time=%"PRId64", okbps=%d, ikbps=%d", | ||
177 | - pithy_print.age(), kbps->get_send_kbps(), kbps->get_recv_kbps()); | 177 | + " time=%"PRId64", okbps=%d,%d,%d, ikbps=%d,%d,%d", |
178 | + pithy_print.age(), | ||
179 | + kbps->get_send_kbps(), kbps->get_send_kbps_sample_high(), kbps->get_send_kbps_sample_medium(), | ||
180 | + kbps->get_recv_kbps(), kbps->get_recv_kbps_sample_high(), kbps->get_recv_kbps_sample_medium()); | ||
178 | } | 181 | } |
179 | 182 | ||
180 | // read from client. | 183 | // read from client. |
@@ -464,9 +467,12 @@ int SrsEdgeForwarder::cycle() | @@ -464,9 +467,12 @@ int SrsEdgeForwarder::cycle() | ||
464 | 467 | ||
465 | // pithy print | 468 | // pithy print |
466 | if (pithy_print.can_print()) { | 469 | if (pithy_print.can_print()) { |
470 | + kbps->sample(); | ||
467 | srs_trace("-> "SRS_LOG_ID_EDGE_PUBLISH | 471 | srs_trace("-> "SRS_LOG_ID_EDGE_PUBLISH |
468 | - " time=%"PRId64", msgs=%d, okbps=%d, ikbps=%d", | ||
469 | - pithy_print.age(), count, kbps->get_send_kbps(), kbps->get_recv_kbps()); | 472 | + " time=%"PRId64", msgs=%d, okbps=%d,%d,%d, ikbps=%d,%d,%d", |
473 | + pithy_print.age(), count, | ||
474 | + kbps->get_send_kbps(), kbps->get_send_kbps_sample_high(), kbps->get_send_kbps_sample_medium(), | ||
475 | + kbps->get_recv_kbps(), kbps->get_recv_kbps_sample_high(), kbps->get_recv_kbps_sample_medium()); | ||
470 | } | 476 | } |
471 | 477 | ||
472 | // ignore when no messages. | 478 | // ignore when no messages. |
@@ -342,9 +342,12 @@ int SrsForwarder::forward() | @@ -342,9 +342,12 @@ int SrsForwarder::forward() | ||
342 | 342 | ||
343 | // pithy print | 343 | // pithy print |
344 | if (pithy_print.can_print()) { | 344 | if (pithy_print.can_print()) { |
345 | + kbps->sample(); | ||
345 | srs_trace("-> "SRS_LOG_ID_FOWARDER | 346 | srs_trace("-> "SRS_LOG_ID_FOWARDER |
346 | - " time=%"PRId64", msgs=%d, okbps=%d, ikbps=%d", | ||
347 | - pithy_print.age(), count, kbps->get_send_kbps(), kbps->get_recv_kbps()); | 347 | + " time=%"PRId64", msgs=%d, okbps=%d,%d,%d, ikbps=%d,%d,%d", |
348 | + pithy_print.age(), count, | ||
349 | + kbps->get_send_kbps(), kbps->get_send_kbps_sample_high(), kbps->get_send_kbps_sample_medium(), | ||
350 | + kbps->get_recv_kbps(), kbps->get_recv_kbps_sample_high(), kbps->get_recv_kbps_sample_medium()); | ||
348 | } | 351 | } |
349 | 352 | ||
350 | // ignore when no messages. | 353 | // ignore when no messages. |
@@ -28,6 +28,12 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -28,6 +28,12 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
28 | #include <srs_protocol_io.hpp> | 28 | #include <srs_protocol_io.hpp> |
29 | #include <srs_kernel_utility.hpp> | 29 | #include <srs_kernel_utility.hpp> |
30 | 30 | ||
31 | +SrsKbpsSample::SrsKbpsSample() | ||
32 | +{ | ||
33 | + bytes = time = 0; | ||
34 | + kbps = 0; | ||
35 | +} | ||
36 | + | ||
31 | SrsKbpsSlice::SrsKbpsSlice() | 37 | SrsKbpsSlice::SrsKbpsSlice() |
32 | { | 38 | { |
33 | io.in = NULL; | 39 | io.in = NULL; |
@@ -39,6 +45,59 @@ SrsKbpsSlice::~SrsKbpsSlice() | @@ -39,6 +45,59 @@ SrsKbpsSlice::~SrsKbpsSlice() | ||
39 | { | 45 | { |
40 | } | 46 | } |
41 | 47 | ||
48 | +int64_t SrsKbpsSlice::get_total_bytes() | ||
49 | +{ | ||
50 | + return bytes + last_bytes - io_bytes_base; | ||
51 | +} | ||
52 | + | ||
53 | +void SrsKbpsSlice::sample() | ||
54 | +{ | ||
55 | + int64_t now = srs_get_system_time_ms(); | ||
56 | + int64_t total_bytes = get_total_bytes(); | ||
57 | + | ||
58 | + if (sample_30s.time <= 0) { | ||
59 | + sample_30s.kbps = 0; | ||
60 | + sample_30s.time = now; | ||
61 | + sample_30s.bytes = total_bytes; | ||
62 | + } | ||
63 | + if (sample_1m.time <= 0) { | ||
64 | + sample_1m.kbps = 0; | ||
65 | + sample_1m.time = now; | ||
66 | + sample_1m.bytes = total_bytes; | ||
67 | + } | ||
68 | + if (sample_5m.time <= 0) { | ||
69 | + sample_5m.kbps = 0; | ||
70 | + sample_5m.time = now; | ||
71 | + sample_5m.bytes = total_bytes; | ||
72 | + } | ||
73 | + if (sample_60m.time <= 0) { | ||
74 | + sample_60m.kbps = 0; | ||
75 | + sample_60m.time = now; | ||
76 | + sample_60m.bytes = total_bytes; | ||
77 | + } | ||
78 | + | ||
79 | + if (now - sample_30s.time > 30 * 1000) { | ||
80 | + sample_30s.kbps = (total_bytes - sample_30s.bytes) * 8 / (now - sample_30s.time); | ||
81 | + sample_30s.time = now; | ||
82 | + sample_30s.bytes = total_bytes; | ||
83 | + } | ||
84 | + if (now - sample_1m.time > 60 * 1000) { | ||
85 | + sample_1m.kbps = (total_bytes - sample_1m.bytes) * 8 / (now - sample_1m.time); | ||
86 | + sample_1m.time = now; | ||
87 | + sample_1m.bytes = total_bytes; | ||
88 | + } | ||
89 | + if (now - sample_5m.time > 300 * 1000) { | ||
90 | + sample_5m.kbps = (total_bytes - sample_5m.bytes) * 8 / (now - sample_5m.time); | ||
91 | + sample_5m.time = now; | ||
92 | + sample_5m.bytes = total_bytes; | ||
93 | + } | ||
94 | + if (now - sample_60m.time > 3600 * 1000) { | ||
95 | + sample_60m.kbps = (total_bytes - sample_60m.bytes) * 8 / (now - sample_60m.time); | ||
96 | + sample_60m.time = now; | ||
97 | + sample_60m.bytes = total_bytes; | ||
98 | + } | ||
99 | +} | ||
100 | + | ||
42 | SrsKbps::SrsKbps() | 101 | SrsKbps::SrsKbps() |
43 | { | 102 | { |
44 | } | 103 | } |
@@ -64,6 +123,8 @@ void SrsKbps::set_io(ISrsProtocolReader* in, ISrsProtocolWriter* out) | @@ -64,6 +123,8 @@ void SrsKbps::set_io(ISrsProtocolReader* in, ISrsProtocolWriter* out) | ||
64 | if (in) { | 123 | if (in) { |
65 | is.last_bytes = is.io_bytes_base = in->get_recv_bytes(); | 124 | is.last_bytes = is.io_bytes_base = in->get_recv_bytes(); |
66 | } | 125 | } |
126 | + // resample | ||
127 | + is.sample(); | ||
67 | 128 | ||
68 | // set output stream | 129 | // set output stream |
69 | // now, set start time. | 130 | // now, set start time. |
@@ -80,41 +141,74 @@ void SrsKbps::set_io(ISrsProtocolReader* in, ISrsProtocolWriter* out) | @@ -80,41 +141,74 @@ void SrsKbps::set_io(ISrsProtocolReader* in, ISrsProtocolWriter* out) | ||
80 | if (out) { | 141 | if (out) { |
81 | os.last_bytes = os.io_bytes_base = out->get_send_bytes(); | 142 | os.last_bytes = os.io_bytes_base = out->get_send_bytes(); |
82 | } | 143 | } |
144 | + // resample | ||
145 | + os.sample(); | ||
83 | } | 146 | } |
84 | 147 | ||
85 | int SrsKbps::get_send_kbps() | 148 | int SrsKbps::get_send_kbps() |
86 | { | 149 | { |
87 | int64_t duration = srs_get_system_time_ms() - is.starttime; | 150 | int64_t duration = srs_get_system_time_ms() - is.starttime; |
88 | - int64_t bytes = get_send_bytes(); | ||
89 | if (duration <= 0) { | 151 | if (duration <= 0) { |
90 | return 0; | 152 | return 0; |
91 | } | 153 | } |
154 | + int64_t bytes = get_send_bytes(); | ||
92 | return bytes * 8 / duration; | 155 | return bytes * 8 / duration; |
93 | } | 156 | } |
94 | 157 | ||
95 | int SrsKbps::get_recv_kbps() | 158 | int SrsKbps::get_recv_kbps() |
96 | { | 159 | { |
97 | int64_t duration = srs_get_system_time_ms() - os.starttime; | 160 | int64_t duration = srs_get_system_time_ms() - os.starttime; |
98 | - int64_t bytes = get_recv_bytes(); | ||
99 | if (duration <= 0) { | 161 | if (duration <= 0) { |
100 | return 0; | 162 | return 0; |
101 | } | 163 | } |
164 | + int64_t bytes = get_recv_bytes(); | ||
102 | return bytes * 8 / duration; | 165 | return bytes * 8 / duration; |
103 | } | 166 | } |
104 | 167 | ||
168 | +int SrsKbps::get_send_kbps_sample_high() | ||
169 | +{ | ||
170 | + return os.sample_30s.kbps; | ||
171 | +} | ||
172 | + | ||
173 | +int SrsKbps::get_recv_kbps_sample_high() | ||
174 | +{ | ||
175 | + return is.sample_30s.kbps; | ||
176 | +} | ||
177 | + | ||
178 | +int SrsKbps::get_send_kbps_sample_medium() | ||
179 | +{ | ||
180 | + return os.sample_5m.kbps; | ||
181 | +} | ||
182 | + | ||
183 | +int SrsKbps::get_recv_kbps_sample_medium() | ||
184 | +{ | ||
185 | + return is.sample_5m.kbps; | ||
186 | +} | ||
187 | + | ||
105 | int64_t SrsKbps::get_send_bytes() | 188 | int64_t SrsKbps::get_send_bytes() |
106 | { | 189 | { |
107 | - if (os.io.out) { | ||
108 | - os.last_bytes = os.io.out->get_send_bytes(); | ||
109 | - } | ||
110 | - return os.bytes + os.last_bytes - os.io_bytes_base; | 190 | + return os.get_total_bytes(); |
111 | } | 191 | } |
112 | 192 | ||
113 | int64_t SrsKbps::get_recv_bytes() | 193 | int64_t SrsKbps::get_recv_bytes() |
114 | { | 194 | { |
195 | + return is.get_total_bytes(); | ||
196 | +} | ||
197 | + | ||
198 | +void SrsKbps::sample() | ||
199 | +{ | ||
200 | + if (os.io.out) { | ||
201 | + os.last_bytes = os.io.out->get_send_bytes(); | ||
202 | + } | ||
203 | + | ||
204 | + // resample | ||
205 | + os.sample(); | ||
206 | + | ||
115 | if (is.io.in) { | 207 | if (is.io.in) { |
116 | is.last_bytes = is.io.in->get_recv_bytes(); | 208 | is.last_bytes = is.io.in->get_recv_bytes(); |
117 | } | 209 | } |
118 | - return is.bytes + is.last_bytes - is.io_bytes_base; | 210 | + |
211 | + // resample | ||
212 | + is.sample(); | ||
119 | } | 213 | } |
120 | 214 |
@@ -34,7 +34,32 @@ class ISrsProtocolReader; | @@ -34,7 +34,32 @@ class ISrsProtocolReader; | ||
34 | class ISrsProtocolWriter; | 34 | class ISrsProtocolWriter; |
35 | 35 | ||
36 | /** | 36 | /** |
37 | +* a kbps sample, for example, 1minute kbps, | ||
38 | +* 10minute kbps sample. | ||
39 | +*/ | ||
40 | +class SrsKbpsSample | ||
41 | +{ | ||
42 | +public: | ||
43 | + int64_t bytes; | ||
44 | + int64_t time; | ||
45 | + int kbps; | ||
46 | +public: | ||
47 | + SrsKbpsSample(); | ||
48 | +}; | ||
49 | + | ||
50 | +/** | ||
37 | * a slice of kbps statistic, for input or output. | 51 | * a slice of kbps statistic, for input or output. |
52 | +* a slice contains a set of sessions, which has a base offset of bytes, | ||
53 | +* where a slice is: | ||
54 | +* starttime(oldest session startup time) | ||
55 | +* bytes(total bytes of previous sessions) | ||
56 | +* io_bytes_base(bytes offset of current session) | ||
57 | +* last_bytes(bytes of current session) | ||
58 | +* so, the total send bytes now is: | ||
59 | +* send_bytes = bytes + last_bytes - io_bytes_base | ||
60 | +* so, the bytes sent duration current session is: | ||
61 | +* send_bytes = last_bytes - io_bytes_base | ||
62 | +* @remark user use set_io to start new session. | ||
38 | */ | 63 | */ |
39 | class SrsKbpsSlice | 64 | class SrsKbpsSlice |
40 | { | 65 | { |
@@ -45,17 +70,34 @@ private: | @@ -45,17 +70,34 @@ private: | ||
45 | }; | 70 | }; |
46 | public: | 71 | public: |
47 | slice_io io; | 72 | slice_io io; |
73 | + // session startup bytes | ||
74 | + // @remark, use total_bytes() to get the total bytes of slice. | ||
48 | int64_t bytes; | 75 | int64_t bytes; |
76 | + // slice starttime, the first time to record bytes. | ||
49 | int64_t starttime; | 77 | int64_t starttime; |
50 | - // startup bytes number for io when set it, | 78 | + // session startup bytes number for io when set it, |
51 | // the base offset of bytes for io. | 79 | // the base offset of bytes for io. |
52 | int64_t io_bytes_base; | 80 | int64_t io_bytes_base; |
53 | // last updated bytes number, | 81 | // last updated bytes number, |
54 | // cache for io maybe freed. | 82 | // cache for io maybe freed. |
55 | int64_t last_bytes; | 83 | int64_t last_bytes; |
84 | + // samples | ||
85 | + SrsKbpsSample sample_30s; | ||
86 | + SrsKbpsSample sample_1m; | ||
87 | + SrsKbpsSample sample_5m; | ||
88 | + SrsKbpsSample sample_60m; | ||
56 | public: | 89 | public: |
57 | SrsKbpsSlice(); | 90 | SrsKbpsSlice(); |
58 | virtual ~SrsKbpsSlice(); | 91 | virtual ~SrsKbpsSlice(); |
92 | +public: | ||
93 | + /** | ||
94 | + * get current total bytes. | ||
95 | + */ | ||
96 | + virtual int64_t get_total_bytes(); | ||
97 | + /** | ||
98 | + * resample all samples. | ||
99 | + */ | ||
100 | + virtual void sample(); | ||
59 | }; | 101 | }; |
60 | 102 | ||
61 | /** | 103 | /** |
@@ -71,6 +113,7 @@ public: | @@ -71,6 +113,7 @@ public: | ||
71 | virtual ~SrsKbps(); | 113 | virtual ~SrsKbps(); |
72 | public: | 114 | public: |
73 | /** | 115 | /** |
116 | + * set io to start new session. | ||
74 | * set the underlayer reader/writer, | 117 | * set the underlayer reader/writer, |
75 | * if the io destroied, for instance, the forwarder reconnect, | 118 | * if the io destroied, for instance, the forwarder reconnect, |
76 | * user must set the io of SrsKbps to NULL to continue to use the kbps object. | 119 | * user must set the io of SrsKbps to NULL to continue to use the kbps object. |
@@ -82,15 +125,28 @@ public: | @@ -82,15 +125,28 @@ public: | ||
82 | public: | 125 | public: |
83 | /** | 126 | /** |
84 | * get total kbps, duration is from the startup of io. | 127 | * get total kbps, duration is from the startup of io. |
128 | + * @remark, use sample() to update data. | ||
85 | */ | 129 | */ |
86 | virtual int get_send_kbps(); | 130 | virtual int get_send_kbps(); |
87 | virtual int get_recv_kbps(); | 131 | virtual int get_recv_kbps(); |
132 | + // 30s | ||
133 | + virtual int get_send_kbps_sample_high(); | ||
134 | + virtual int get_recv_kbps_sample_high(); | ||
135 | + // 5m | ||
136 | + virtual int get_send_kbps_sample_medium(); | ||
137 | + virtual int get_recv_kbps_sample_medium(); | ||
88 | public: | 138 | public: |
89 | /** | 139 | /** |
90 | * get the total send/recv bytes, from the startup of the oldest io. | 140 | * get the total send/recv bytes, from the startup of the oldest io. |
141 | + * @remark, use sample() to update data. | ||
91 | */ | 142 | */ |
92 | virtual int64_t get_send_bytes(); | 143 | virtual int64_t get_send_bytes(); |
93 | virtual int64_t get_recv_bytes(); | 144 | virtual int64_t get_recv_bytes(); |
145 | +public: | ||
146 | + /** | ||
147 | + * resample all samples. | ||
148 | + */ | ||
149 | + virtual void sample(); | ||
94 | }; | 150 | }; |
95 | 151 | ||
96 | #endif | 152 | #endif |
@@ -504,9 +504,12 @@ int SrsRtmpConn::playing(SrsSource* source) | @@ -504,9 +504,12 @@ int SrsRtmpConn::playing(SrsSource* source) | ||
504 | 504 | ||
505 | // reportable | 505 | // reportable |
506 | if (pithy_print.can_print()) { | 506 | if (pithy_print.can_print()) { |
507 | + kbps->sample(); | ||
507 | srs_trace("-> "SRS_LOG_ID_PLAY | 508 | srs_trace("-> "SRS_LOG_ID_PLAY |
508 | - " time=%"PRId64", duration=%"PRId64", msgs=%d, okbps=%d, ikbps=%d", | ||
509 | - pithy_print.age(), duration, count, kbps->get_send_kbps(), kbps->get_recv_kbps()); | 509 | + " time=%"PRId64", msgs=%d, okbps=%d,%d,%d, ikbps=%d,%d,%d", |
510 | + pithy_print.age(), count, | ||
511 | + kbps->get_send_kbps(), kbps->get_send_kbps_sample_high(), kbps->get_send_kbps_sample_medium(), | ||
512 | + kbps->get_recv_kbps(), kbps->get_recv_kbps_sample_high(), kbps->get_recv_kbps_sample_medium()); | ||
510 | } | 513 | } |
511 | 514 | ||
512 | if (count <= 0) { | 515 | if (count <= 0) { |
@@ -590,9 +593,11 @@ int SrsRtmpConn::fmle_publish(SrsSource* source) | @@ -590,9 +593,11 @@ int SrsRtmpConn::fmle_publish(SrsSource* source) | ||
590 | 593 | ||
591 | // reportable | 594 | // reportable |
592 | if (pithy_print.can_print()) { | 595 | if (pithy_print.can_print()) { |
596 | + kbps->sample(); | ||
593 | srs_trace("<- "SRS_LOG_ID_CLIENT_PUBLISH | 597 | srs_trace("<- "SRS_LOG_ID_CLIENT_PUBLISH |
594 | - " time=%"PRId64", okbps=%d, ikbps=%d", | ||
595 | - pithy_print.age(), kbps->get_send_kbps(), kbps->get_recv_kbps()); | 598 | + " time=%"PRId64", okbps=%d,%d,%d, ikbps=%d,%d,%d", pithy_print.age(), |
599 | + kbps->get_send_kbps(), kbps->get_send_kbps_sample_high(), kbps->get_send_kbps_sample_medium(), | ||
600 | + kbps->get_recv_kbps(), kbps->get_recv_kbps_sample_high(), kbps->get_recv_kbps_sample_medium()); | ||
596 | } | 601 | } |
597 | 602 | ||
598 | // process UnPublish event. | 603 | // process UnPublish event. |
@@ -666,9 +671,12 @@ int SrsRtmpConn::flash_publish(SrsSource* source) | @@ -666,9 +671,12 @@ int SrsRtmpConn::flash_publish(SrsSource* source) | ||
666 | 671 | ||
667 | // reportable | 672 | // reportable |
668 | if (pithy_print.can_print()) { | 673 | if (pithy_print.can_print()) { |
674 | + kbps->sample(); | ||
669 | srs_trace("<- "SRS_LOG_ID_WEB_PUBLISH | 675 | srs_trace("<- "SRS_LOG_ID_WEB_PUBLISH |
670 | - " time=%"PRId64", okbps=%d, ikbps=%d", | ||
671 | - pithy_print.age(), kbps->get_send_kbps(), kbps->get_recv_kbps()); | 676 | + " time=%"PRId64", okbps=%d,%d,%d, ikbps=%d,%d,%d", |
677 | + pithy_print.age(), | ||
678 | + kbps->get_send_kbps(), kbps->get_send_kbps_sample_high(), kbps->get_send_kbps_sample_medium(), | ||
679 | + kbps->get_recv_kbps(), kbps->get_recv_kbps_sample_high(), kbps->get_recv_kbps_sample_medium()); | ||
672 | } | 680 | } |
673 | 681 | ||
674 | // process UnPublish event. | 682 | // process UnPublish event. |
@@ -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 "0" | 32 | #define VERSION_MAJOR "0" |
33 | #define VERSION_MINOR "9" | 33 | #define VERSION_MINOR "9" |
34 | -#define VERSION_REVISION "96" | 34 | +#define VERSION_REVISION "97" |
35 | #define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION | 35 | #define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION |
36 | // server info. | 36 | // server info. |
37 | #define RTMP_SIG_SRS_KEY "srs" | 37 | #define RTMP_SIG_SRS_KEY "srs" |
-
请 注册 或 登录 后发表评论