αž”αž„αŸ’αž€αžΎαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž– Linux αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžŸαŸ†αžŽαžΎ 1.2 αž›αžΆαž“ JSON αž€αŸ’αž“αž»αž„αž˜αž½αž™αžœαž·αž“αžΆαž‘αžΈ

αž˜αž‚αŸ’αž‚αž»αž‘αŸ’αž‘αŸαžŸαž€αŸαž›αž˜αŸ’αž’αž·αžαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž•αŸ’αžŸαžΆαž™αž›αžΎαž€αžΆαžšαž€αŸ‚αžŸαž˜αŸ’αžšαž½αž›αž”αžšαž·αž™αžΆαž€αžΆαžŸαž›αžΈαž“αž»αž… αžŠαžΎαž˜αŸ’αž”αžΈαžŸαž˜αŸ’αžšαŸαž…αž”αžΆαž“αž“αžΌαžœαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž’αžαž·αž”αžšαž˜αžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαŸ†αžŽαžΎ HTTP αŸ” αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαžŠαŸ‚αž›αž”αžΆαž“αžŸαŸ’αž“αžΎαž‘αžΎαž„αž”αžΆαž“αž’αŸ’αžœαžΎαž±αŸ’αž™αžœαžΆαž’αžΆαž…αž’αŸ’αžœαžΎαž‘αŸ…αž”αžΆαž“αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸƒαžŠαŸ†αžŽαžΎαžšαž€αžΆαžš JSON αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαž”αžŽαŸ’αžŽαžΆαž›αŸαž™ libreactor αž“αŸ…αž€αŸ’αž“αž»αž„αž”αžšαž·αžŸαŸ’αžαžΆαž“ Amazon EC2 (4 vCPU) αž–αžΈ 224 αž–αžΆαž“αŸ‹αžŸαŸ†αžŽαžΎ API αž€αŸ’αž“αž»αž„αž˜αž½αž™αžœαž·αž“αžΆαž‘αžΈαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžšαž“αŸƒ Amazon Linux 2 αž‡αžΆαž˜αž½αž™αžαžΊαžŽαŸ‚αž› 4.14 αž‘αŸ… 1.2 αž›αžΆαž“αžŸαŸ†αžŽαžΎαž€αŸ’αž“αž»αž„αž˜αž½αž™ αž‘αžΈαž–αžΈαžšαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž€αžΆαžšαž”αž„αŸ’αž€αžΎαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž– (αž€αžΆαžšαž€αžΎαž“αž‘αžΎαž„ 436%) αž αžΎαž™αž€αŸαž“αžΆαŸ†αž±αŸ’αž™αž˜αžΆαž“αž€αžΆαžšαž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž€αžΆαžšαž–αž“αŸ’αž™αžΆαžšαž–αŸαž›αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαŸ†αžŽαžΎ 79% αŸ” αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαžŠαŸ‚αž›αž”αžΆαž“αžŸαŸ’αž“αžΎαž‘αžΎαž„αž‚αžΊαž˜αž·αž“αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž…αŸ†αž–αŸ„αŸ‡ libreactor αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž–αŸαž›αž”αŸ’αžšαžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ http αž•αŸ’αžŸαŸαž„αž‘αŸ€αž αžšαž½αž˜αž‘αžΆαŸ†αž„ nginx, Actix, Netty αž“αž·αž„ Node.js (libreactor αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž–αŸ’αžšαŸ„αŸ‡αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαžœαžΆαž”αž„αŸ’αž αžΆαž‰αž–αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αŸ’αžšαžŸαžΎαžšαž‡αžΆαž„αž˜αž»αž“)αŸ”

αž”αž„αŸ’αž€αžΎαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž– Linux αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžŸαŸ†αžŽαžΎ 1.2 αž›αžΆαž“ JSON αž€αŸ’αž“αž»αž„αž˜αž½αž™αžœαž·αž“αžΆαž‘αžΈ

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αŸ–

  • αž”αž„αŸ’αž€αžΎαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αž€αžΌαžŠαž’αŸ’αž“αž€αžŸαžšαžŸαŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ” αž‡αž˜αŸ’αžšαžΎαžŸ R18 αž–αžΈαž§αž”αž€αžšαžŽαŸ Techempower αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“ αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ‚αž›αž˜αŸ’αž’αžŠαŸ„αž™αž€αžΆαžšαžŠαž€αž€αžΌαžŠαž…αŸαž‰αžŠαžΎαž˜αŸ’αž”αžΈαž€αŸ†αžŽαžαŸ‹αž…αŸ†αž“αž½αž“αžŸαŸ’αž“αžΌαž›αžŸαŸŠαžΈαž—αžΈαž™αžΌαžŠαŸ‚αž›αž”αžΆαž“αž”αŸ’αžšαžΎ (αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž”αž„αŸ’αž€αžΎαž“αž›αŸ’αž”αžΏαž“αž€αžΆαžšαž„αžΆαžš 25-27%) αžŠαŸ„αž™αž”αŸ’αžšαž˜αžΌαž›αž•αŸ’αžαž»αŸ†αž“αŸ…αž€αŸ’αž“αž»αž„ GCC αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž‡αž˜αŸ’αžšαžΎαžŸ "-O3" (αž€αžΆαžšαž€αžΎαž“αž‘αžΎαž„αž–αžΈ 5-10%) αž“αž·αž„ "-march-native" (5-10%) αž‡αŸ†αž“αž½αžŸαž€αžΆαžšαž αŸ…αž‘αžΌαžšαžŸαž–αŸ’αž‘αžŠαŸ‚αž›αž’αžΆαž“/αžŸαžšαžŸαŸαžšαžŠαŸ„αž™ recv/send (5-10%) αž“αž·αž„αž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž€αžΆαžšαž…αŸ†αžŽαžΆαž™αž›αžΎαžŸαž–αŸαž›αž”αŸ’αžšαžΎ pthreads (2-3%) . αž€αžΆαžšαž€αžΎαž“αž‘αžΎαž„αž“αŸƒαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαžŸαžšαž»αž”αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž€αžΆαžšαž”αž„αŸ’αž€αžΎαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αž€αžΌαžŠαž‚αžΊ 55% αž αžΎαž™αž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αž”αž“αŸ’αžαž”αžΆαž“αž€αžΎαž“αž‘αžΎαž„αž–αžΈ 224k req/s αžŠαž›αŸ‹ 347k req/s αŸ”
  • αž”αž·αž‘αž€αžΆαžšαž€αžΆαžšαž–αžΆαžšαž”αŸ’αžšαž†αžΆαŸ†αž„αž“αžΉαž„αž—αžΆαž–αž„αžΆαž™αžšαž„αž‚αŸ’αžšαŸ„αŸ‡αž“αŸƒαž€αžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αžαžΆαž˜αž€αžΆαžšαž”αŸ‰αžΆαž“αŸ‹αžŸαŸ’αž˜αžΆαž“αŸ” αžŠαŸ„αž™αž”αŸ’αžšαžΎαž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžš "nospectre_v1 nospectre_v2 pti=off mds=off tsx_async_abort=off" αž“αŸ…αž–αŸαž›αž•αŸ’αž‘αž»αž€αžαžΊαžŽαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž”αž„αŸ’αž€αžΎαž“αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αž 28% αž αžΎαž™αž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αž”αž“αŸ’αžαž€αžΎαž“αž‘αžΎαž„αž–αžΈ 347k req/s αžŠαž›αŸ‹ 446k req/s αŸ” αžŠαŸ„αž™αž‘αŸ‚αž€αž–αžΈαž‚αŸ’αž“αžΆ αž€αžΆαžšαž€αžΎαž“αž‘αžΎαž„αž–αžΈαž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžš β€œnospectre_v1” (αž€αžΆαžšαž€αžΆαžšαž–αžΆαžšαž–αžΈ Spectre v1 + SWAPGS) αž‚αžΊ 1-2%, β€œnospectre_v2” (αž€αžΆαžšαž€αžΆαžšαž–αžΆαžšαž–αžΈ Spectre v2) - 15-20%, β€œpti=off” (Spectre v3/Meltdown) - 6%, "mds=off tsx_async_abort=off" (MDS/Zombieload αž“αž·αž„ TSX Asynchronous Abort) - 6% αŸ” αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž€αžΆαžšαž–αžΆαžšαž”αŸ’αžšαž†αžΆαŸ†αž„αž“αžΉαž„ L1TF/Foreshadow (l1tf=flush), iTLB multihit, Speculative Store Bypass αž“αž·αž„αž€αžΆαžšαžœαžΆαž™αž”αŸ’αžšαž αžΆαžš SRBDS αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš αžŠαŸ‚αž›αž˜αž·αž“αž”αŸ‰αŸ‡αž–αžΆαž›αŸ‹αžŠαž›αŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž…αžΆαž”αŸ‹αžαžΆαŸ†αž„αž–αžΈαž–αž½αž€αž‚αŸαž˜αž·αž“αž”αžΆαž“αž”αŸ’αžšαžŸαž–αŸ’αžœαž‡αžΆαž˜αž½αž™αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ‚αž›αž”αžΆαž“αžŸαžΆαž€αž›αŸ’αž”αž„ (αž§αž‘αžΆαž αžšαžŽαŸ αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž…αŸ†αž–αŸ„αŸ‡ KVM αž”αžΆαž“αžŠαžΆαž€αŸ‹αžŸαŸ†αž”αž»αž€ αž“αž·αž˜αŸ’αž˜αž·αžαž“αž·αž„αž‚αŸ†αžšαžΌαžŸαŸŠαžΈαž—αžΈαž™αžΌαž•αŸ’αžŸαŸαž„αž‘αŸ€αž) αŸ”
  • αž€αžΆαžšαž”αž·αž‘αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžœαž“αž€αž˜αŸ’αž˜ αž“αž·αž„αž™αž“αŸ’αžαž€αžΆαžšαž‘αž”αŸ‹αžŸαŸ’αž€αžΆαžαŸ‹αž€αžΆαžšαž αŸ…αž‡αžΆαž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ "auditctl -a never,task" αž“αž·αž„αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž‡αž˜αŸ’αžšαžΎαžŸ "--security-opt seccomp=unconfined" αž“αŸ…αž–αŸαž›αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž’αž»αž„ docker αŸ” αž€αžΆαžšαž€αžΎαž“αž‘αžΎαž„αž“αŸƒαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαžŸαžšαž»αž”αž‚αžΊ 11% αž αžΎαž™αž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αž”αž“αŸ’αžαž”αžΆαž“αž€αžΎαž“αž‘αžΎαž„αž–αžΈ 446k req/s αžŠαž›αŸ‹ 495k req/s αŸ”
  • αž€αžΆαžšαž”αž·αž‘αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš iptables/netfilter αžŠαŸ„αž™αžŠαŸ„αŸ‡αž…αŸαž‰αž˜αŸ‰αžΌαžŒαž»αž›αžαžΊαžŽαŸ‚αž›αžŠαŸ‚αž›αž–αžΆαž€αŸ‹αž–αŸαž“αŸ’αž’αŸ” αž‚αŸ†αž“αž·αžαžŠαžΎαž˜αŸ’αž”αžΈαž”αž·αž‘αž‡αž‰αŸ’αž‡αžΆαŸ†αž„αž—αŸ’αž›αžΎαž„αžŠαŸ‚αž›αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž“αŸ…αž€αŸ’αž“αž»αž„αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž˜αž½αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‡αž˜αŸ’αžšαž»αž‰αžŠαŸ„αž™αž›αž‘αŸ’αž’αž•αž›αž‘αž˜αŸ’αžšαž„αŸ‹αž€αžΆαžšαžœαž·αž“αž·αž…αŸ’αž†αŸαž™αžŠαŸ„αž™αž˜αž»αžαž„αžΆαžš nf_hook_slow αž…αŸ†αžŽαžΆαž™αž–αŸαž› 18% αž“αŸƒαž–αŸαž›αžœαŸαž›αžΆαžŠαžΎαž˜αŸ’αž”αžΈαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αŸ” αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžαžΆ nftables αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αžΆαž“αŸ‹αžαŸ‚αž˜αžΆαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αž‡αžΆαž„ iptables αž”αŸ‰αž»αž“αŸ’αžαŸ‚ Amazon Linux αž”αž“αŸ’αžαž”αŸ’αžšαžΎ iptables αŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž”αž·αž‘ iptables αž€αžΆαžšαž€αžΎαž“αž‘αžΎαž„αž“αŸƒαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž‚αžΊ 22% αž αžΎαž™αž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αž”αž“αŸ’αžαž”αžΆαž“αž€αžΎαž“αž‘αžΎαž„αž–αžΈ 495k req/s αžŠαž›αŸ‹ 603k req/s αŸ”
  • αž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž€αžΆαžšαž’αŸ’αžœαžΎαž…αŸ†αžŽαžΆαž€αžŸαŸ’αžšαž»αž€αžšαž”αžŸαŸ‹αž§αž”αž€αžšαžŽαŸαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžšαžœαžΆαž„αžŸαŸ’αž“αžΌαž›αžŸαŸŠαžΈαž—αžΈαž™αžΌαž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆ αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αž“αŸƒαž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹αžšαž”αžŸαŸ‹αžαž½αžšαž€αŸ’αž”αžΆαž›αŸ” αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž‘αžΆαŸ†αž„αž“αŸ…αž€αž˜αŸ’αžšαž·αžαž“αŸƒαžŠαŸ†αžŽαžΎαžšαž€αžΆαžš libreactor αž…αž„αž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ…αžŸαŸ’αž“αžΌαž› CPU (CPU Pinning) αž“αž·αž„αžαžΆαž˜αžšαž™αŸˆαž€αžΆαžš pinning network handlers (Receive Side Scaling)αŸ” αž§αž‘αžΆαž αžšαžŽαŸ irqbalance αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž”αž·αž‘ αž αžΎαž™β€‹αž—αžΆαž–β€‹αž‘αžΆαž€αŸ‹β€‹αž‘αž„β€‹αž‡αž½αžšβ€‹αž‘αŸ…β€‹αž“αžΉαž„ CPU αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž€αŸ†αžŽαžαŸ‹β€‹αž™αŸ‰αžΆαž„β€‹αž…αŸ’αž”αžΆαžŸαŸ‹β€‹αž“αŸ…β€‹αž€αŸ’αž“αž»αž„ /proc/irq/$IRQ/smp_affinity_list αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž”αŸ’αžšαžΎαžŸαŸ’αž“αžΌαž›αžŸαŸŠαžΈαž—αžΈαž™αžΌαžŠαžΌαž…αž‚αŸ’αž“αžΆαžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžš libreactor αž“αž·αž„αž‡αž½αžšαž”αžŽαŸ’αžαžΆαž‰αž“αŸƒαž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž…αžΌαž› αž§αž”αž€αžšαžŽαŸαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™ BPF αž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŠαŸ‚αž›αž—αŸ’αž‡αžΆαž”αŸ‹αžŠαŸ„αž™αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž‘αž„αŸ‹ SO_ATTACH_REUSEPORT_CBPF αž“αŸ…αž–αŸαž›αž”αž„αŸ’αž€αžΎαžαžšαž“αŸ’αž’αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž…αž„αž‡αž½αžšαž“αŸƒαž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž…αŸαž‰αž‘αŸ…αž€αžΆαž“αŸ‹ CPU αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹ /sys/class/net/eth0/queues/tx- αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš /xps_cpu αŸ” αž€αžΆαžšαž€αžΎαž“αž‘αžΎαž„αž“αŸƒαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαžŸαžšαž»αž”αž‚αžΊ 38% αž αžΎαž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αžΎαž“αž‘αžΎαž„αž–αžΈ 603k req/s αžŠαž›αŸ‹ 834k req/s αŸ”
  • αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αž“αŸƒαž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžšαŸ†αžαžΆαž“ αž“αž·αž„αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž€αžΆαžšαž”αŸ„αŸ‡αž†αŸ’αž“αŸ„αžαŸ” αž€αžΆαžšαž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžšαž”αŸ€αž” adaptive-rx αž“αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž‰αŸ’αž‡αžΆ ENA αž“αž·αž„αžšαŸ€αž”αž…αŸ† sysctl net.core.busy_read αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αžΆαž“αž”αž„αŸ’αž€αžΎαž“αž…αŸ†αž“αž½αž“ 28% (αž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αž”αž“αŸ’αžαž€αžΎαž“αž‘αžΎαž„αž–αžΈ 834k req/s αž‘αŸ… 1.06M req/s αž αžΎαž™αž—αžΆαž–αž™αžΊαžαž™αŸ‰αžΆαžœαž”αžΆαž“αžαž™αž…αž»αŸ‡αž–αžΈ 361ΞΌs αž‘αŸ… 292ΞΌs)αŸ”
  • αž€αžΆαžšαž”αž·αž‘αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŠαŸ‚αž›αž“αžΆαŸ†αž‘αŸ…αžŠαž›αŸ‹αž€αžΆαžšαž‘αž”αŸ‹αžŸαŸ’αž€αžΆαžαŸ‹αžŠαŸ‚αž›αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž‡αž„αŸ‹αž”αžŽαŸ’αžαžΆαž‰αŸ” αž€αžΆαžšαž”αž·αž‘αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš dhclient αž“αž·αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ IP αžŠαŸ„αž™αžŠαŸƒαž”αžΆαž“αž”αžŽαŸ’αžαžΆαž›αž±αŸ’αž™αž˜αžΆαž“αž€αžΆαžšαž€αžΎαž“αž‘αžΎαž„αž“αŸƒαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αž 6% αž αžΎαž™αž›αŸ†αž αžΌαžšαž€αžΎαž“αž‘αžΎαž„αž–αžΈ 1.06M req/s αž‘αŸ… 1.12M req/s αŸ” αž αŸαžαž»αž•αž›αžŠαŸ‚αž› dhclient αž”αŸ‰αŸ‡αž–αžΆαž›αŸ‹αžŠαž›αŸ‹αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž‚αžΊαž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαžœαž·αž—αžΆαž‚αž…αžšαžΆαž…αžšαžŽαŸαžŠαŸ„αž™αž”αŸ’αžšαžΎαžšαž“αŸ’αž’αž†αŸ…αŸ”
  • αž”αŸ’αžšαž™αž»αž‘αŸ’αž’αž”αŸ’αžšαž†αžΆαŸ†αž„αž“αžΉαž„αž€αžΆαžšαž…αžΆαž€αŸ‹αžŸαŸ„αžšαž”αž„αŸ’αžœαž·αž›αŸ” αž€αžΆαžšαž”αŸ’αžαžΌαžšαž‡αž„αŸ‹αž”αžŽαŸ’αžαžΆαž‰αž‘αŸ…αž‡αžΆαžšαž”αŸ€αž” "noqueue" αžαžΆαž˜αžšαž™αŸˆ sysctl "net.core.default_qdisc=noqueue" αž“αž·αž„ "tc qdisc αž‡αŸ†αž“αž½αžŸ dev eth0 root mq" αž”αžΆαž“αž“αžΆαŸ†αž±αŸ’αž™αž˜αžΆαž“αž€αžΆαžšαž€αžΎαž“αž‘αžΎαž„αž“αŸƒαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αž 2% αž αžΎαž™αž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αž”αž“αŸ’αžαž€αžΎαž“αž‘αžΎαž„αž–αžΈ 1.12M req/s αžŠαž›αŸ‹ 1.15M req/s αŸ”
  • αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αž’αž“αžΈαžαž·αž‡αž“αž…αž»αž„αž€αŸ’αžšαŸ„αž™ αžŠαžΌαž…αž‡αžΆαž€αžΆαžšαž”αž·αž‘ GRO (Generic Receive Offload) αžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ β€œethtool -K eth0 gro off” αž“αž·αž„αž€αžΆαžšαž‡αŸ†αž“αž½αžŸαž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž€αžΆαžšαž€αž€αžŸαŸ’αž‘αŸ‡αž‚αžΌαž”αž‡αžΆαž˜αž½αž™ reno αžŠαŸ„αž™αž”αŸ’αžšαžΎ sysctl β€œnet.ipv4.tcp_congestion_control=renoβ€αŸ” αž€αžΆαžšαž€αžΎαž“αž‘αžΎαž„αž•αž›αž·αžαž—αžΆαž–αžŸαžšαž»αž”αž‚αžΊ 4% αŸ” αž›αŸ†αž αžΌαžšαž…αžΌαž›αž”αžΆαž“αž€αžΎαž“αž‘αžΎαž„αž–αžΈ 1.15M req/s αž‘αŸ… 1.2M req/s αŸ”

αž”αž“αŸ’αžαŸ‚αž˜αž–αžΈαž›αžΎαž€αžΆαžšαž”αž„αŸ’αž€αžΎαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αžŠαŸ‚αž›αž”αžΆαž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž’αžαŸ’αžαž”αž‘αž€αŸαž–αž·αž—αžΆαž€αŸ’αžŸαžΆαž’αŸ†αž–αžΈαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαžŠαŸ‚αž›αž˜αž·αž“αž“αžΆαŸ†αž‘αŸ…αžšαž€αž€αžΆαžšαž€αžΎαž“αž‘αžΎαž„αž“αŸƒαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαžŠαŸ‚αž›αžšαŸ†αž–αžΉαž„αž‘αž»αž€αŸ” αž§αž‘αžΆαž αžšαžŽαŸ αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž“αŸαŸ‡αž”αžΆαž“αž”αŸ’αžšαŸ‚αž‡αžΆαž‚αŸ’αž˜αžΆαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αŸ–

  • αž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžš libreactor αžŠαŸ„αž™αž‘αŸ‚αž€αž–αžΈαž‚αŸ’αž“αžΆαž˜αž·αž“αž˜αžΆαž“αž—αžΆαž–αžαž»αžŸαž”αŸ’αž›αŸ‚αž€αž‚αŸ’αž“αžΆαž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž–αžΈαž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž€αž»αž„αžαžΊαž“αŸαžšαž“αŸ„αŸ‡αž‘αŸαŸ” αž€αžΆαžšαž‡αŸ†αž“αž½αžŸ writev αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž•αŸ’αž‰αžΎ αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž“αž’αžαž·αž”αžšαž˜αžΆαž“αŸ…αž€αŸ’αž“αž»αž„ epoll_wait αž“αž·αž„αž€αžΆαžšαž–αž·αžŸαŸ„αž’αž“αŸαž‡αžΆαž˜αž½αž™αž€αŸ†αžŽαŸ‚ αž“αž·αž„αž‘αž„αŸ‹αžšαž”αžŸαŸ‹ GCC αž˜αž·αž“αž˜αžΆαž“αž•αž›αž”αŸ‰αŸ‡αž–αžΆαž›αŸ‹αž‘αŸ (αž₯αž‘αŸ’αž’αž·αž–αž›αž‚αžΊαž‚αž½αžšαž±αŸ’αž™αž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‘αž„αŸ‹ "-O3" αž“αž·αž„ "-march-native" αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡) αŸ”
  • αž€αžΆαžšαž’αžΆαž”αŸ‹αžŠαŸαžαžαžΊαžŽαŸ‚αž›αž›αžΈαž“αž»αž…αž‘αŸ…αž€αŸ†αžŽαŸ‚ 4.19 αž“αž·αž„ 5.4 αžŠαŸ„αž™αž”αŸ’αžšαžΎαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αŸ†αžŽαžαŸ‹αž–αŸαž› SCHED_FIFO αž“αž·αž„ SCHED_RR αžšαŸ€αž”αž…αŸ† sysctl kernel.sched_min_granularity_ns, kernel.sched_wakeup_granularity_ns, transparent_hugepages=clocktever, noteffects.
  • αž“αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž‰αŸ’αž‡αžΆ ENA αž€αžΆαžšαž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš Offload modes (segmentation, scatter-gather, rx/tx checksum) αž€αžΆαžšαž€αžŸαžΆαž„αž‡αžΆαž˜αž½αž™αž‘αž„αŸ‹ β€œ-O3” αž“αž·αž„αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžš ena.rx_queue_size αž“αž·αž„ ena.force_large_llq_header αž˜αž·αž“αž˜αžΆαž“αž•αž›αž”αŸ‰αŸ‡αž–αžΆαž›αŸ‹αž‘αŸαŸ”
  • αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž”αžŽαŸ’αžαžΆαž‰αž‡αž„αŸ‹αž˜αž·αž“αž’αŸ’αžœαžΎαž’αŸ„αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αŸ’αžšαžŸαžΎαžšαž‘αžΎαž„αž‘αŸαŸ–
    • αž”αž·αž‘ IPv6αŸ– ipv6.disable=1
    • αž”αž·αž‘ VLANαŸ– modprobe -rv 8021q
    • αž”αž·αž‘αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž”αŸ’αžšαž—αž–αž€αž‰αŸ’αž…αž”αŸ‹
      • net.ipv4.conf.all.rp_filter=0
      • net.ipv4.conf.eth0.rp_filter=0
      • net.ipv4.conf.all.accept_local=1 (αž₯αž‘αŸ’αž’αž·αž–αž›αž’αžœαž·αž‡αŸ’αž‡αž˜αžΆαž“)
    • net.ipv4.tcp_sack = ៑
    • net.ipv4.tcp_dsack=0
    • net.ipv4.tcp_mem/tcp_wmem/tcp_rmem
    • net.core.netdev_budget
    • net.core.dev_weight
    • net.core.netdev_max_backlog
    • net.ipv4.tcp_slow_start_after_idle=0
    • net.ipv4.tcp_moderate_rcvbuf=0
    • net.ipv4.tcp_timestamps=0
    • net.ipv4.tcp_low_latency = ៑
    • SO_PRIORITY
    • TCP_NODELAY

    αž”αŸ’αžšαž—αž–: opennet.ru

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹