XNU æºä»£ç è£å³ | AIçæåç¿»è¯
ç°å¨ææäºè¶³å¤çXNUæºä»£ç è¯æ®ã以䏿¯è£å³ï¼
XNU æºä»£ç 对â为ä»ä¹32æ¯æä¼éæ©âçè£å³
论æ®1ï¼â线ç¨é©»çå¨å æ ¸çepoll/kqueueä¸â
æ¯è¯é¨åéè¯¯ï¼æºå¶æ£ç¡®ã
macOS ä½¿ç¨ kqueueï¼èé epollï¼é£æ¯ Linux çæºå¶ï¼ãä½é»å¡æºå¶æ¯çå®åå¨çãæ¥èª kern_event.c:8038-8044ï¼
kqu.kqf->kqf_state |= KQ_SLEEP;
assert_wait_deadline(&kqu.kqf->kqf_count, THREAD_ABORTSAFE,
kectx->kec_deadline);
kqunlock(kqu);
if (__probable((flags & (KEVENT_FLAG_POLL | KEVENT_FLAG_KERNEL)) == 0)) {
thread_block_parameter(kqueue_scan_continue, qu.kqf);
__builtin_unreachable();
}
线ç¨å
è°ç¨ assert_wait_deadline()ï¼å°èªå·±æ³¨åå°çå¾
éåï¼ï¼ç¶åè°ç¨ thread_block_parameter()ï¼åè
å¨ sched_prim.c:3752 å¤è°ç¨ thread_block_reason()ãè¿ä¼äº§ç䏿¬¡å®æ´çä¸ä¸æåæ¢ââ线ç¨ä¼å®å
¨ä» CPU è¿è¡éåä¸ç§»é¤ãè£å³ï¼æ£ç¡®ï¼çº¿ç¨å¨çå¾
æé´ç¡®å®ä½¿ç¨ 0% CPUã
论æ®2ï¼â没æè°åº¦ï¼ä¸æ¶è卿â
æ£ç¡®ã æ¥èª sched_prim.c:3788-3801ï¼
self->continuation = continuation;
self->parameter = parameter;
// ...
new_thread = thread_select(self, processor, &reason);
thread_invoke(self, new_thread, reason);
线ç¨å°å
¶ CPU æ ¸å¿ç§»äº¤ç»å¦ä¸ä¸ªçº¿ç¨ãè¿ä¸æ¯è½®è¯¢ï¼ä¹ä¸æ¯ç©ºè½¬ã线ç¨ç¶æè½¬æ¢ä¸º TH_WAITï¼æ ¹æ® thread.h:512 为 0x01ï¼ï¼ä» TH_RUNï¼0x04ï¼ä¸ç§»é¤ãè£å³ï¼æ£ç¡®ã
论æ®3ï¼å¨ 64+ 个æä»¶æè¿°ç¬¦æ¶ï¼âå æ ¸ç kqueue 伿§è¡æ´å¤è½®è¯¢å·¥ä½â
é误ãè¿æ¯è¿ç¯æç« 䏿大çé®é¢ã
kqueue ä¸ä¼è½®è¯¢å·²æ³¨åçæä»¶æè¿°ç¬¦ãå®çº¯ç²¹æ¯äºä»¶é©±å¨çãæ¥èª kern_event.c:7859-7868ï¼
do {
while ((kn = TAILQ_FIRST(queue)) != NULL) {
error = knote_process(kn, kectx, callback);
// ...
}
} while (queue-- > base_queue);
kqueue_process() ä»
éåå°¾é¨éåï¼kqf_queueï¼ä¸å·²è§¦åç knotesï¼èéææå·²æ³¨åç knotesãå½ TCP æ°æ®å°è¾¾æä¸ªå¥æ¥åæ¶ï¼ç½ç»æ è°ç¨ sorwakeup() â sowakeup() â KNOTE() â knote_enqueue()ï¼ä»
å°è¯¥ç¹å® knote å å
¥éåãæ«æå¤æåº¦ä¸º O(已触å)ï¼èé O(已注å)ã
è¿ä¸ select() ææ¬è´¨åºå«ï¼åè
æ¯æ¬¡é½ä¼æ«ææææä»¶æè¿°ç¬¦ãkqueue 注åäº 200 个æä»¶æè¿°ç¬¦ä½åªæ 3 个æäºä»¶ï¼ä¸æ³¨åäº 2000 个æä»¶æè¿°ç¬¦ä½åªæ 3 个æäºä»¶ï¼æ§è¡çå·¥ä½éå®å
¨ç¸åãè£å³ï¼âæ´å¤è½®è¯¢å·¥ä½âçè®ºç¹æ¯é误çã
论æ®4ï¼âæ¯ä¸ª git è¿ç¨æå¼çº¦ 5-10 个æä»¶æè¿°ç¬¦â以åâ32 个工ä½è¿ç¨æ¶ 200-300 个æä»¶æè¿°ç¬¦â
å¤§è´æ£ç¡®ã æ¥èª syslimits.h:108 å param.h:101ï¼
#define OPEN_MAX 10240 /* æ¯ä¸ªè¿ç¨æå¤§æå¼æä»¶æ° */
#define NOFILE 256 /* æ¯ä¸ªè¿ç¨é»è®¤æå¤§æå¼æä»¶æ° */
macOS å 许æ¯ä¸ªè¿ç¨æå¤æå¼ 10,240 个æä»¶æè¿°ç¬¦ãæ¯ä¸ª git è¿ç¨ä¼æå¼å¥æ¥å + pack æä»¶ + ç´¢å¼ + æ¾æ£å¯¹è±¡ï¼å æ¤çº¦ 5-10 个æä»¶æè¿°ç¬¦æ¯åççã以 32 个工ä½è¿ç¨è®¡ç®ï¼çº¦ 200-300 个æä»¶æè¿°ç¬¦æ¯åççï¼ä¸å¨éå¶èå´å ãè£å³ï¼æ£ç¡®ã
论æ®5ï¼âGitHub å¨çº¦ 30-40 个并å SSH è¿æ¥æ¶è¿è¡éæµâ
æ æ³ä» XNU æºä»£ç éªè¯ââè¿æ¯ GitHub æå¡ç«¯çç¥ï¼èéå æ ¸è¡ä¸ºãä½è¿æ¯åççãSSH è¿æ¥ææ¾èç建ç«å¼éï¼å¯é¥äº¤æ¢ãééå¤ç¨ï¼ã
论æ®6ï¼æ°å¦è®¡ç®ä¸æ¹å¤ç计ç®
ååæ£ç¡®ï¼ç²¾åº¦æè¯¯ã ç论ä¸çæå°è®¡ç®æ¯åççï¼160 个ä»åº / N 个工ä½è¿ç¨ à RTTï¼ãä½å®é æ°å¼ï¼24.1 ç§ã9.9 ç§ã9.6 ç§ï¼è¢«åç°ä¸ºç²¾ç¡®æµéç»æââ妿è¿äºæ¥èªå®é åºåæµè¯ï¼é£æ²¡é®é¢ã妿æ¯ä¼°ç®å¼ï¼é£ä¹è¿ç§ç²¾åº¦å ·æè¯¯å¯¼æ§ã
æ»ç»
çæ£ä½¿ 32 æä¸ºæä¼éæ©çåå ä¸ kqueue å¼éæ å ³ã 纯粹åå³äºï¼
- GitHub æå¡ç«¯çè¿æ¥æ¥åéç
- ä½ ç代çï¼DMIT/hysteria2ï¼ç带宽/è¿æ¥æ± éå¶
- å½ç½ç» RTT æä¸ºä¸»å¯¼å ç´ æ¶åºç°çæ¶çéåââå¨ç¶é¢å®¹éä¹å¤å¢å å·¥ä½è¿ç¨åªä¼äº§çæ´å¤å¤äº TCP 积åç¶æçè¿æ¥ï¼èä¸ä¼æåååé
è¿ç¯æç« ç kqueue åææ¯æèå¼±çé¨åãkqueue å¯ä»¥ä¼é
å°æ©å±å°æ°å个æä»¶æè¿°ç¬¦ââè¿æ£æ¯å®ç设计ç®çï¼ä¸ select() ä¸åï¼ãç¶é¢å¨äºç½ç»è·¯å¾ï¼èéå
æ ¸ã
