核心内容摘要
鼠大侠授权系统V2.0最新版下载
先把 Debloating 的能力边界讲�白
1 Debloating å�ªèƒ½â€œé™�æµ�â€�ä¸�能“çœ�内å˜â€�ç›®å‰� Debloating å�šçš„æ˜¯æŠŠâ€œä½¿ç”¨ä¸çš„æœ€å¤§ buffer 规模â€�å�š cap但它ä¸�会改å�˜ä¸¤ä»¶äº‹buffer çš„å®�际大å°�segment sizeä¸�å�˜buffer 的数é‡�ä¸�å�˜æ‰€ä»¥å®ƒæ— 法é™�ä½�ä½ ä½œä¸šçš„ network memory å� ç”¨ã€‚ä½ è¦�真çœ�内å˜å�ªèƒ½æ‰‹å·¥åЍ䏋é�¢ä¸¤ç±»å‡�å°‘ buffer æ•°é‡�buffers-per-channel / floating-buffers-per-gateå‡�å°� buffer 大å°�taskmanager.memory.segment-size
2 想把 in-flight å�‹å¾—æ›´ä½�通常è¦�手工æ�§â€œæ•°é‡�â€�æœ‰äº›åœºæ™¯ä½ ä¼šå�‘ç�°å¼€äº† Debloatingcheckpoint 还是慢ã€�unaligned checkpoint 还是大å�Ÿå› æ˜¯ä½ æƒ³è¦�çš„ in-flight 下é™�比 Debloating 能å�šåˆ°çš„æ›´ä½�。这时建议直æ�¥æ‰‹å·¥é™�制 buffer æ•°é‡�而ä¸�是å�ªæŒ‡æœ› Debloating 自己“å†�缩一点â€�。
高并å�‘parallelism ~200是 Debloating 的典å�‹é£�险区文档给的ç»�验é��常直æ�¥å¹¶å�‘ä¸Šåˆ°å‡ ç™¾å��默认 Debloating é…�ç½®å�¯èƒ½å‡ºç�°å��å��下é™�checkpoint 时间比预期更长æ�¨è��动作是把 floating buffers å¢�大到至少ç‰äº�å¹¶å�‘度taskmanager.network.memory.floating-buffers-per-gate:parallelism注æ„�触å�‘问题的并å�‘é˜ˆå€¼å› ä½œä¸šè€Œå¼‚ä½†é€šå¸¸æ˜¯â€œå‡ ç™¾çº§åˆ«â€�开始æ˜�显。
Network buffer 生命周期先会算æ‰�知é�“该调哪颗è�ºä¸�Flink 在 TaskManager 内维护多个本地 buffer pool输出侧æ¯�个 output gate 一个 pool输入侧æ¯�个 input gate 一个 poolæ¯�个 buffer pool çš„ç›®æ ‡ buffer æ•°é‡�计算公å¼�是target_buffers #channels * buffers-per-channel floating-buffers-per-gate对应é…�ç½®taskmanager.network.memory.buffers-per-channelæ¯�个 channel 的“专å±� bufferâ€�常被称为 exclusive bufferstaskmanager.network.memory.floating-buffers-per-gateæ¯�个 gate 的“浮动 bufferâ€�用æ�¥åº”对倾斜/çª�å�‘taskmanager.memory.segment-sizeæ¯�个 buffer 的大å°�è¿™æ�¡å…¬å¼�é��å¸¸å…³é”®å› ä¸ºå®ƒè§£é‡Šäº†ä¸¤ä¸ªç�°è±¡ä½ 一æ��高并å�‘#channels å¢�多如æ�œ buffers-per-channel ä¸�为 0网络内å˜éœ€æ±‚会迅速膨胀floating buffers 是“按 gateâ€�分é…�特别影å“�高并å�‘ã€�倾斜ã€�çª�å�‘情况下的稳定å��å��
Input buffers � Output buffers行为完全��别用�一套直觉
1 Input buffers有“必须拿到â€�的阈值拿ä¸�åˆ°ä¼šå¤±è´¥è¾“å…¥ä¾§çš„ç›®æ ‡ buffer æ•°ä¸�æ˜¯ä¸€å®šèƒ½æ‹¿åˆ°çš„ã€‚ç³»ç»Ÿæœ‰ä¸ªé˜ˆå€¼å†³å®šç›®æ ‡æ•°ä¸â€œé˜ˆå€¼ä»¥å†…â€�的部分算required超过阈值的算optionalæ‹¿ä¸�到 required 会导致 task 失败拿ä¸�到 optional ä¸�会失败但性能å�¯èƒ½æ‚„悄下é™�。é…�置项taskmanager.network.memory.read-buffer.required-per-gate.max默认值streamingInteger.MAX_VALUE基本上就是“尽é‡�都算 requiredâ€�batch1000官方ä¸�å»ºè®®è½»æ˜“æ”¹å®ƒå› ä¸ºè¿™æ˜¯ä¸€ä¸ªâ€œç”¨å¤±è´¥æ�¢æ€§èƒ½ç¡®å®šæ€§â€�的开关阈值调å°�æ›´ä¸�容易报 “insufficient number of network buffersâ€�但å�¯èƒ½ silent 性能下é™�阈值调大更强调性能确定性但 buffer ä¸�足时更容易失败
2 Output buffers更“宽容â€�但有 per-subpartition 上é™�输出侧å�ªæœ‰ä¸€ç§� buffer ç±»å�‹ä¼šè¢«æ‰€æœ‰ subpartitions 共享。为了防æ¢ä¸¥é‡�倾斜导致æŸ�个 subpartition å�ƒæ�‰è¿‡å¤š buffer有上é™�taskmanager.network.memory.max-buffers-per-channel并且输出侧对 exclusive/floating çš„é…�置更åƒ�“æ�¨è��值â€�buffer ä¸�够时也能继ç»è·‘æ¯�个 subpartition 至少 1 个 exclusive bufferã€�floating 甚至å�¯ä»¥ä¸º
Overdraft buffers解决“å��å�‹ä¸‹çº¿ç¨‹è¢«å�¡æ»â€�的兜底机制æ¯�个 output subtask 还å�¯ä»¥é¢�外申请少é‡�overdraft buffers默认 5taskmanager.network.memory.max-overdraft-buffers-per-gate:5它们å�ªåœ¨è¿™ç§�情况使用下游å��å�‹å¯¼è‡´å�‘é€�å�—阻当å‰�处ç�†éœ€è¦�超过 1 个网络 buffer æ‰�能“把手头这一下å�šå®Œâ€�å…¸å�‹è§¦å�‘场景åº�列化大 record一个 record 装ä¸�è¿›å�•个 bufferflatMap 一进多出ç�¬æ—¶è¾“出很多Window 触å�‘器一波喷å�‘å¼�输出没有 overdraft æ—¶subtask 线程å�¯èƒ½åœ¨å��å�‹ä¸Šé˜»å¡�甚至影å“� unaligned checkpoint 完æˆ�。overdraft æ˜¯ä¸¥æ ¼å�¯é€‰çš„设为 0 也å…�许å�ªæ˜¯ä½ è¦�æ�¥å�—“更容易å�¡ä½�但能慢慢挪â€�的行为。é‡�è¦�é™�制å�ªå¯¹Pipelined Shuffle生效。
æ€�么选 buffer 大å°�ä¸�æ•°é‡�åˆ«å‡æ„Ÿè§‰æŒ‰è¯�æ�®ä¸�å…¬å¼�æ�¥
1 buffer sizesegment-size通常别动除é��ä½ çœŸçœ‹åˆ°ç½‘ç»œç“¶é¢ˆbuffer 太å°�或 flush 太频ç¹�execution.buffer-timeout会让 per-buffer 开销放大å��å��下é™�。建议除é��ä½ çœ‹åˆ°æ˜�确网络瓶颈迹象下游 idleã€�上游 backpressuredã€�output queue 满ã€�下游 input queue 空å�¦åˆ™ä¸�建议é� åŠ å¤§ buffer size 或调 buffer timeout æ�¥â€œæ‹�脑袋æ��速â€�。buffer 过大也会带æ�¥å‰¯ä½œç”¨å†…å˜å� 用高unaligned checkpoint æ•°æ�®å·¨å¤§aligned checkpoint æ—¶é—´æ›´é•¿buffer-timeout å°�æ—¶å�Šæ»¡å°± flush浪费内å˜ä¸”产生更多å°�包
2 buffer count用��公�估算一个“�解释�的起点手工调 buffer 数�时用这个估算公�number_of_buffers expected_throughput * buffer_roundtrip / buffer_size示例文档给的�数expected_throughput 320MB/sbuffer_roundtrip 1msbuffer_size 32KB计算时注���一致320MB/s × 1ms 320MB/s ×
001s
32MB
32MB / 32KB
32MB
3
68KB
3
68KB / 32KB
1