System Design শেখো
শেখো / লো-লেটেন্সি ইঞ্জিনিয়ারিং

Kernel Bypass ও Zero-copy

11 মিনিট Module 11 · Low-Latency Engineering 🔥
এক নজরে
  • প্রতিটি syscall ও kernel network stack context switch, copy আর interrupt-এর কারণে latency যোগ করে।
  • Kernel bypass (DPDK, Solarflare/Onload) packet সরাসরি user-space-এ এনে kernel-কে পুরো এড়িয়ে যায়।
  • Zero-copy ও busy-polling দিয়ে data copy ও interrupt overhead বাদ দিয়ে microsecond-level latency অর্জন করা যায়।

সমস্যাটা কী?

তুমি যখন একটা network packet পড়ো — recv() কল করো — সেটা দেখতে সহজ এক লাইন। কিন্তু পর্দার আড়ালে অনেক কিছু ঘটে: NIC (network card) packet পেয়ে একটা interrupt তোলে, CPU তার কাজ থামিয়ে interrupt handle করে, packet kernel buffer-এ যায়, তারপর তোমার application যখন recv() করে তখন আবার একটা mode switch (user → kernel) হয় এবং data kernel buffer থেকে তোমার user buffer-এ copy হয়।

এই পুরো পথে প্রতিটি ধাপ latency যোগ করে — mode switch (~১০০ns), interrupt handling, context switch (~১-৫µs), memory copy। সাধারণ অ্যাপে এসব নগণ্য। কিন্তু একটা trading system যেখানে পুরো order path হতে হবে কয়েক microsecond-এ, সেখানে kernel-এর এই overhead-ই হয়ে দাঁড়ায় সবচেয়ে বড় শত্রু। তাই জন্ম kernel bypass-এর — kernel-কে পুরোপুরি পাশ কাটিয়ে যাওয়া।

মূল ধারণা

Kernel Bypass হলো এমন কৌশল যেখানে application সরাসরি network hardware (NIC)-এর সাথে user-space থেকে কথা বলে, OS kernel-এর network stack ও syscall-কে সম্পূর্ণ এড়িয়ে — ফলে mode switch, copy আর interrupt overhead বাদ যায়।

পেছনের দার্শনিক ধারণাটির নাম mechanical sympathy (LMAX-এর Martin Thompson-এর জনপ্রিয় করা শব্দ) — হার্ডওয়্যার আসলে কীভাবে কাজ করে তা গভীরভাবে বুঝে সেই অনুযায়ী software লেখা, যাতে hardware-এর সাথে "লড়াই" না করে তার সাথে "সহযোগিতা" করা যায়। F1 ড্রাইভার যেমন গাড়ির যন্ত্রকৌশল বুঝে চালায়, তেমনি low-latency ইঞ্জিনিয়ার CPU, cache, NIC বুঝে কোড লেখে।

কীভাবে কাজ করে

Kernel path বনাম Bypass path

ধাপKernel path (সাধারণ)Kernel bypass (DPDK)
Packet আসাNIC interrupt তোলেNIC সরাসরি user-space ring-এ DMA করে
Mode switchuser ↔ kernel transitionনেই
Data copykernel buffer → user bufferzero-copy, সরাসরি user memory-তে
CPU modelinterrupt-drivenbusy-poll (PMD)
আনুমানিক latencyদশ µs+১-৫ µs বা তার কম

Busy-polling বনাম Interrupt

সাধারণ I/O interrupt-driven — NIC-এর কিছু পাঠানোর থাকলে সে CPU-কে "ডাকে"। এতে CPU অন্য কাজ করতে পারে, কিন্তু interrupt উঠতে ও handle হতে সময় লাগে এবং তা অনিশ্চিত।

Kernel bypass-এ ব্যবহৃত হয় busy-polling (PMD — Poll Mode Driver) — একটি CPU core অবিরাম NIC-কে জিজ্ঞেস করতে থাকে "নতুন packet এসেছে?" interrupt-এর জন্য অপেক্ষা নেই, তাই latency ন্যূনতম ও predictable। মূল্য? সেই core সবসময় ১০০% busy থাকে (যদিও কোনো packet না আসে), বিদ্যুৎ ও CPU খরচ হয়। Trading-এ এই trade-off গ্রহণযোগ্য।

Zero-copy

প্রতিটি memory copy CPU cycle ও memory bandwidth খায়। Zero-copy কৌশল এই redundant copy বাদ দেয়:

  • sendfile() — disk থেকে socket-এ data পাঠাতে user-space ঘুরিয়ে আনার দরকার নেই।
  • mmap() — file সরাসরি memory-তে map করে copy এড়ায়।
  • DMA সরাসরি user buffer-এ — kernel bypass-এ NIC সরাসরি application-এর memory-তে packet লেখে।
সাধারণ পথ:  NIC → kernel buffer → (copy) → user buffer → app
Zero-copy:   NIC → (DMA) → user buffer → app   // মাঝের copy নেই
সহজ উদাহরণ

ভাবো একটা কুরিয়ার প্যাকেট ঢাকায় এসেছে। সাধারণ পথ (kernel): প্যাকেট প্রথমে কেন্দ্রীয় সর্টিং অফিসে (kernel) যায়, সেখানে কর্মীরা যাচাই করে, তারপর তোমার এলাকার শাখায় পাঠায়, সেখান থেকে আবার তোমার হাতে — প্রতি ধাপে দেরি। Kernel bypass মানে কুরিয়ার গাড়ি সরাসরি তোমার বাসার সামনে এসে প্যাকেট দিয়ে যাচ্ছে (DMA to user-space), মাঝখানের অফিস নেই। আর busy-polling মানে — তুমি interrupt (কলিং বেল)-এর অপেক্ষা না করে নিজেই বারবার গেটে গিয়ে দেখছ গাড়ি এলো কিনা; দ্রুত, কিন্তু তুমি অন্য কিছু করতে পারছ না।

কৌশল ও প্রযুক্তি

  • DPDK (Data Plane Development Kit): Intel-এর open-source framework, packet সরাসরি user-space-এ poll করে। টেলিকম, firewall, trading-এ ব্যবহৃত।
  • Solarflare / Onload (এখন AMD): trading জগতে বিখ্যাত — application কোড না বদলেই TCP stack user-space-এ চালায়।
  • RDMA (Remote Direct Memory Access): এক মেশিনের memory থেকে আরেক মেশিনের memory-তে CPU-কে প্রায় না জড়িয়ে data পাঠায়।
  • io_uring: Linux-এর আধুনিক async I/O interface, syscall সংখ্যা নাটকীয়ভাবে কমায় (পুরো bypass নয়, কিন্তু অনেক হালকা)।
  • AF_XDP: kernel-এর মধ্যেই একটি দ্রুত bypass-সদৃশ path।

কখন ব্যবহার করবে / করবে না

Kernel bypass ব্যবহার করো শুধু যখন latency সত্যিই extreme গুরুত্বপূর্ণ — HFT, packet processing (router/firewall at line rate), real-time market data। এসব ক্ষেত্রে microsecond-ই টাকা।

ব্যবহার করবে না সাধারণ web service-এ। কারণ kernel bypass-এ তুমি OS-এর অনেক সুবিধা হারাও — TCP/IP stack নিজে সামলাতে হয়, security isolation কমে, debugging কঠিন, আর একটা core পুরো dedicate করতে হয়।

সাবধান

Kernel bypass মানে তুমি OS-এর সুরক্ষা ও সুবিধার অনেকটাই ছেড়ে দিচ্ছ — networking stack, firewall, monitoring tools আর সরাসরি কাজ নাও করতে পারে। dedicated hardware (নির্দিষ্ট NIC) লাগে, এবং dedicated CPU core busy-poll-এ পুড়তে থাকে। ভুল কনফিগে এটা সাহায্যের বদলে ক্ষতি করতে পারে — শুধু profiling প্রমাণ করলে যে kernel-ই bottleneck, তবেই এদিকে যাও।

বাস্তব উদাহরণ

HFT firm-গুলো প্রায় সর্বজনীনভাবে Solarflare NIC + Onload ব্যবহার করে, এমনকি কেউ কেউ পুরো order logic FPGA-তে নিয়ে যায় যাতে CPU ও kernel দুটোই বাদ পড়ে — wire-to-wire latency কয়েকশো nanosecond।

Cloudflare ও CDN-রা DPDK/XDP দিয়ে DDoS mitigation করে line-rate-এ packet filter করতে।

Kafka zero-copy (sendfile) ব্যবহার করে disk থেকে network-এ data পাঠাতে — এটাই তার বিপুল throughput-এর একটা মূল কারণ, যদিও Kafka kernel bypass করে না।

টিপস

ইন্টারভিউতে "kernel bypass কেন দ্রুত" জিজ্ঞেস করলে শুধু "DPDK" নাম বোলো না — ব্যাখ্যা করো তিনটি জিনিস বাদ যায়: mode switch, data copy, interrupt latency। আর সবসময় trade-off উল্লেখ করো (CPU core পুরো burn হয়, OS feature হারায়)। "mechanical sympathy" শব্দটা ব্যবহার করলে interviewer বুঝবে তুমি গভীরভাবে এই domain-এর সংস্কৃতি জানো।

মূল শব্দ (Key Terms)

মিনি কুইজ

1. একটি সাধারণ syscall (যেমন read/recv) কেন latency যোগ করে?

2. Busy-polling interrupt-চালিত I/O-র তুলনায় কী trade-off আনে?

3. Zero-copy-র মূল লক্ষ্য কী?