aimd_rate_control.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. #include "../estimator/aimd_rate_control.h"
  2. #include "../cc/razor_log.h"
  3. #include <math.h>
  4. #include <assert.h>
  5. aimd_rate_controller_t* aimd_create(uint32_t max_rate, uint32_t min_rate)
  6. {
  7. aimd_rate_controller_t* aimd;
  8. razor_info("start aimd_create. \n");
  9. aimd = (aimd_rate_controller_t*)calloc(1, sizeof(aimd_rate_controller_t));
  10. aimd->max_rate = max_rate;
  11. aimd->min_rate = min_rate;
  12. aimd->curr_rate = 0;
  13. aimd->avg_max_bitrate_kbps = -1.0f;
  14. aimd->var_max_bitrate_kbps = 0.4f;
  15. aimd->state = kRcHold;
  16. aimd->region = kRcMaxUnknown;
  17. aimd->beta = 0.85f;
  18. aimd->time_last_bitrate_change = -1;
  19. aimd->time_first_incoming_estimate = -1;
  20. aimd->inited = -1;
  21. aimd->rtt = DEFAULT_RTT;
  22. aimd->in_experiment = 0;
  23. aimd->continue_hold_count = 0;
  24. razor_info("end aimd_create. \n");
  25. return aimd;
  26. }
  27. void aimd_destroy(aimd_rate_controller_t* aimd)
  28. {
  29. if (aimd != NULL)
  30. free((void *)aimd);
  31. razor_info("aimd_destroy. \n");
  32. }
  33. void aimd_set_start_bitrate(aimd_rate_controller_t* aimd, uint32_t bitrate)
  34. {
  35. aimd->curr_rate = bitrate;
  36. aimd->inited = 0;
  37. razor_info("aimd_set_start_bitrate. bitrate: %u \n", bitrate);
  38. }
  39. #define DEFAULT_FEELBACK_SIZE 64
  40. #define MAX_FEELBACK_INTERVAL 1000
  41. #define MIN_FELLBACK_INTERVAL 200
  42. int64_t aimd_get_feelback_interval(aimd_rate_controller_t* aimd)
  43. {
  44. /*计算feelback只占5%的带宽负荷下,发送feelback的时间间隔*/
  45. int64_t interval = (int64_t)(DEFAULT_FEELBACK_SIZE * 8 * 1000 / ((0.05 * aimd->curr_rate) + 0.5));
  46. interval = SU_MAX(SU_MIN(MAX_FEELBACK_INTERVAL, interval), MIN_FELLBACK_INTERVAL);
  47. razor_debug("aimd_get_feelback_interval. interval: %I64d \n", interval);
  48. return interval;
  49. }
  50. /*判断aimd控制器是否可以进行网络带宽调节*/
  51. int aimd_time_reduce_further(aimd_rate_controller_t* aimd, int64_t cur_ts, uint32_t incoming_rate)
  52. {
  53. int64_t reduce_interval = SU_MAX(SU_MIN(200, aimd->rtt), 10);
  54. razor_debug("aimd_time_reduce_further. cur_ts: %I64d incoming_rate: %u reduce_interval: %I64d time_last_bitrate_change: %I64d \n",
  55. cur_ts, incoming_rate, reduce_interval, aimd->time_last_bitrate_change);
  56. if (cur_ts - aimd->time_last_bitrate_change >= reduce_interval)
  57. return 0;
  58. if (aimd->inited == 0 && aimd->curr_rate / 2 > incoming_rate)
  59. return 0;
  60. return -1;
  61. }
  62. void aimd_set_rtt(aimd_rate_controller_t* aimd, uint32_t rtt)
  63. {
  64. aimd->rtt = rtt;
  65. }
  66. void aimd_set_min_bitrate(aimd_rate_controller_t* aimd, uint32_t bitrate)
  67. {
  68. aimd->min_rate = bitrate;
  69. aimd->curr_rate = SU_MAX(aimd->min_rate, aimd->curr_rate);
  70. }
  71. void aimd_set_max_bitrate(aimd_rate_controller_t* aimd, uint32_t bitrate)
  72. {
  73. aimd->max_rate = bitrate;
  74. aimd->curr_rate = SU_MIN(aimd->max_rate, aimd->curr_rate);
  75. }
  76. static uint32_t clamp_bitrate(aimd_rate_controller_t* aimd, uint32_t new_bitrate, uint32_t coming_rate)
  77. {
  78. //huchen delete, let new_bitrate change faster
  79. /*const uint32_t max_bitrate_bps = 3 * coming_rate / 2 + 10000;
  80. if (new_bitrate > aimd->curr_rate && new_bitrate > max_bitrate_bps)
  81. new_bitrate = SU_MAX(aimd->curr_rate, max_bitrate_bps);*/
  82. return SU_MIN(SU_MAX(new_bitrate, aimd->min_rate), aimd->max_rate);
  83. }
  84. /*计算一次带宽的增量,一般是用于初期增长阶段,有点象慢启动*/
  85. static uint32_t multiplicative_rate_increase(int64_t cur_ts, int64_t last_ts, uint32_t curr_bitrate)
  86. {
  87. //huchen modify, let new_bitrate change faster, 1.08;
  88. double alpha = 1.15;
  89. uint32_t ts_since;
  90. uint32_t multiplicative_rate_increase = 0;
  91. if (last_ts > -1) {
  92. ts_since = SU_MIN((uint32_t)(cur_ts - last_ts), 1000);
  93. alpha = pow(alpha, ts_since / 1000.0);
  94. }
  95. multiplicative_rate_increase = (uint32_t)(SU_MAX(curr_bitrate * (alpha - 1.0), 1000.0));
  96. razor_debug("multiplicative_rate_increase. alpha: %lf multiplicative_rate_increase: %u \n",
  97. alpha, multiplicative_rate_increase);
  98. return multiplicative_rate_increase;
  99. }
  100. int aimd_get_near_max_inc_rate(aimd_rate_controller_t* aimd)
  101. {
  102. int inc_rate = 0;
  103. //huchen modify change faster 30.0;
  104. double bits_per_frame = aimd->curr_rate / 15.0 ;
  105. double packets_per_frame = ceil(bits_per_frame / (8.0 * 1000.0));
  106. double avg_packet_size_bits = bits_per_frame / packets_per_frame;
  107. /*Approximate the over-use estimator delay to 100 ms*/
  108. const int64_t response_time = (aimd->rtt + 100) * 2;
  109. inc_rate = (int)(SU_MAX(4000, (avg_packet_size_bits * 1000) / response_time));
  110. razor_debug("aimd_get_near_max_inc_rate. bits_per_frame:%lf, packets_per_frame:%lf, avg_packet_size_bits:%lf response_time:%I64d inc_rate:%d \n",
  111. bits_per_frame, packets_per_frame, avg_packet_size_bits, response_time, inc_rate);
  112. return inc_rate;
  113. }
  114. /*计算一个在稳定期间的带宽增量*/
  115. static uint32_t additive_rate_increase(aimd_rate_controller_t* aimd, int64_t cur_ts, int64_t last_ts)
  116. {
  117. //huchen modify *2+2500, let new_bitrate change faster;
  118. uint32_t additive_rate_increase = (uint32_t)((cur_ts - last_ts) * aimd_get_near_max_inc_rate(aimd) / 1000.0)*2+2500;
  119. razor_debug("additive_rate_increase. ts_delta: %I64d additive_rate_increase: %u \n",
  120. cur_ts - last_ts, additive_rate_increase);
  121. return additive_rate_increase;
  122. }
  123. static void update_max_bitrate_estimate(aimd_rate_controller_t* aimd, float incoming_bitrate_kps)
  124. {
  125. const float alpha = 0.05f;
  126. if (aimd->avg_max_bitrate_kbps == -1.0f)
  127. aimd->avg_max_bitrate_kbps = incoming_bitrate_kps;
  128. else
  129. aimd->avg_max_bitrate_kbps = (1 - alpha) * aimd->avg_max_bitrate_kbps + alpha * incoming_bitrate_kps;
  130. /* Estimate the max bit rate variance and normalize the variance with the average max bit rate.*/
  131. {
  132. const float norm = SU_MAX(aimd->avg_max_bitrate_kbps, 1.0f);
  133. aimd->var_max_bitrate_kbps = (1 - alpha) * aimd->var_max_bitrate_kbps + alpha * (aimd->avg_max_bitrate_kbps - incoming_bitrate_kps) * (aimd->avg_max_bitrate_kbps - incoming_bitrate_kps) / norm;
  134. }
  135. /*0.4 ~= 14 kbit/s at 500 kbit/s*/
  136. if (aimd->var_max_bitrate_kbps < 0.4f)
  137. aimd->var_max_bitrate_kbps = 0.4f;
  138. /* 2.5f ~= 35 kbit/s at 500 kbit/s*/
  139. if (aimd->var_max_bitrate_kbps > 2.5f)
  140. aimd->var_max_bitrate_kbps = 2.5f;
  141. razor_debug("update_max_bitrate_estimate. incoming_bitrate_kps: %f avg_max_bitrate_kbps: %f var_max_bitrate_kbps: %f \n",
  142. incoming_bitrate_kps, aimd->avg_max_bitrate_kbps, aimd->var_max_bitrate_kbps);
  143. }
  144. static void aimd_change_region(aimd_rate_controller_t* aimd, int region)
  145. {
  146. aimd->region = region;
  147. }
  148. static void aimd_change_state(aimd_rate_controller_t* aimd, rate_control_input_t* input, int64_t cur_ts)
  149. {
  150. razor_debug("aimd_change_state. cur_ts: %I64d before input state: %d aimd state: %d \n",
  151. cur_ts, input->state, aimd->state);
  152. switch (input->state) {
  153. case kBwNormal:
  154. if (aimd->state == kRcHold) {
  155. aimd->time_last_bitrate_change = cur_ts;
  156. aimd->state = kRcIncrease;
  157. }
  158. break;
  159. case kBwOverusing:
  160. if (aimd->state != kRcDecrease)
  161. aimd->state = kRcDecrease;
  162. break;
  163. case kBwUnderusing:
  164. aimd->state = kRcHold;
  165. break;
  166. default:
  167. assert(0);
  168. }
  169. //huchen add, let new_bitrate change faster
  170. if (aimd->state == kRcHold){
  171. aimd->continue_hold_count++;
  172. if (aimd->continue_hold_count > 5){
  173. aimd->state = kRcIncrease;
  174. aimd->continue_hold_count = 0;
  175. }
  176. } else {
  177. aimd->continue_hold_count = 0;
  178. }
  179. razor_debug("aimd_change_state. after aimd state: %d \n",
  180. aimd->state);
  181. }
  182. static uint32_t aimd_change_bitrate(aimd_rate_controller_t* aimd, uint32_t new_bitrate, rate_control_input_t* input, int64_t cur_ts)
  183. {
  184. float incoming_kbitrate, max_kbitrate;
  185. float rate_decrease;
  186. if (input->incoming_bitrate == 0)
  187. input->incoming_bitrate = aimd->curr_rate;
  188. if (aimd->inited == -1 && input->state == kBwOverusing)
  189. return aimd->curr_rate;
  190. aimd_change_state(aimd, input, cur_ts);
  191. incoming_kbitrate = input->incoming_bitrate / 1000.0f;
  192. max_kbitrate = sqrt(aimd->avg_max_bitrate_kbps * aimd->var_max_bitrate_kbps);
  193. switch (aimd->state){
  194. case kRcHold:
  195. break;
  196. case kRcIncrease:
  197. if (aimd->avg_max_bitrate_kbps >= 0 && incoming_kbitrate > aimd->avg_max_bitrate_kbps + 3 * max_kbitrate){ /*当前码率比平均最大码率大很多,进行倍数增*/
  198. aimd_change_region(aimd, kRcMaxUnknown);
  199. aimd->avg_max_bitrate_kbps = -1.0f;
  200. }
  201. if (aimd->region == kRcNearMax) /*进行加性增*/
  202. new_bitrate += additive_rate_increase(aimd, cur_ts, aimd->time_last_bitrate_change);
  203. else /*起始阶段,进行倍数性增*/
  204. new_bitrate += multiplicative_rate_increase(cur_ts, aimd->time_last_bitrate_change, new_bitrate);
  205. aimd->time_last_bitrate_change = cur_ts;
  206. razor_debug("aimd_change_bitrate. aimd: kRcIncrease, new bitrate = %u, input->incoming_bitrate = %u, curr_bitrate = %u\n",
  207. new_bitrate, input->incoming_bitrate, aimd->curr_rate);
  208. break;
  209. case kRcDecrease:
  210. //huchen modify, let new_bitrate change slower, because incoming_bitrate change too faster
  211. /*new_bitrate = (uint32_t)(aimd->beta * input->incoming_bitrate + 0.5);
  212. if (new_bitrate > aimd->curr_rate){
  213. if (aimd->region != kRcMaxUnknown)
  214. new_bitrate = (uint32_t)(aimd->avg_max_bitrate_kbps * 1000 * aimd->beta + 0.5f);
  215. new_bitrate = SU_MIN(new_bitrate, aimd->curr_rate);
  216. }*/
  217. rate_decrease = (cur_ts - aimd->time_last_bitrate_change) >= 100 ? 0 : 1 - (cur_ts - aimd->time_last_bitrate_change)/100;//time related
  218. new_bitrate = (uint32_t)((aimd->beta + (1 - aimd->beta) * rate_decrease) * aimd->curr_rate + 0.5) ;
  219. razor_debug("aimd_change_bitrate. aimd: RcDecrease, new bitrate = %u, input->incoming_bitrate = %u, curr_bitrate = %u\n",
  220. new_bitrate, input->incoming_bitrate, aimd->curr_rate);
  221. aimd_change_region(aimd, kRcNearMax);
  222. if (aimd->inited == 0 && input->incoming_bitrate < aimd->curr_rate)
  223. aimd->last_decrease = aimd->curr_rate - new_bitrate;
  224. if (incoming_kbitrate < aimd->avg_max_bitrate_kbps - 3 * max_kbitrate)
  225. aimd->avg_max_bitrate_kbps = -1.0f;
  226. aimd->inited = 0;
  227. update_max_bitrate_estimate(aimd, incoming_kbitrate);
  228. aimd->state = kRcHold;
  229. aimd->time_last_bitrate_change = cur_ts;
  230. break;
  231. default:
  232. assert(0);
  233. }
  234. return clamp_bitrate(aimd, new_bitrate, input->incoming_bitrate);
  235. }
  236. /*更新一次输入的带宽,进行aimd带宽调整*/
  237. #define k_initialization_ts 5000
  238. uint32_t aimd_update(aimd_rate_controller_t* aimd, rate_control_input_t* input, int64_t cur_ts)
  239. {
  240. if (aimd->inited == -1){
  241. if (aimd->time_first_incoming_estimate < 0){ /*确定第一次update的时间戳*/
  242. if (input->incoming_bitrate > 0)
  243. aimd->time_first_incoming_estimate = cur_ts;
  244. }
  245. else if (cur_ts - aimd->time_first_incoming_estimate > k_initialization_ts && input->incoming_bitrate > 0){ /*5秒后进行将统计到的带宽作为初始化带宽*/
  246. aimd->curr_rate = input->incoming_bitrate;
  247. aimd->inited = 0;
  248. }
  249. }
  250. razor_debug("aimd_update. cur_ts: %I64d \n", cur_ts);
  251. aimd->curr_rate = aimd_change_bitrate(aimd, aimd->curr_rate, input, cur_ts);
  252. return aimd->curr_rate;
  253. }
  254. void aimd_set_estimate(aimd_rate_controller_t* aimd, int bitrate, int64_t cur_ts)
  255. {
  256. aimd->inited = 0;
  257. aimd->curr_rate = clamp_bitrate(aimd, bitrate, bitrate);
  258. aimd->time_last_bitrate_change = cur_ts;
  259. }
  260. int aimd_get_expected_bandwidth_period(aimd_rate_controller_t* aimd)
  261. {
  262. int kMinPeriodMs = 2000;
  263. int kDefaultPeriodMs = 3000;
  264. int kMaxPeriodMs = 50000;
  265. int increase_rate = aimd_get_near_max_inc_rate(aimd);
  266. if (aimd->last_decrease == 0)
  267. return kDefaultPeriodMs;
  268. return SU_MIN(kMaxPeriodMs,
  269. SU_MAX(1000 * (int64_t)(aimd->last_decrease) / increase_rate, kMinPeriodMs));
  270. }