Kem Intensif DevOps · Pelajaran

Saluran Paip Penstriman dan Paip Bernama untuk Daya Pemprosesan

Gunakan FIFO dan penggantian proses untuk menstrim data antara peringkat tanpa fail perantara

Pelajaran 4 daripada 413 langkah

Saluran Paip Penstriman dan Paip Bernama untuk Daya Pemprosesan ialah pelajaran Kem Intensif DevOps percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Kem Intensif DevOps, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Kem Intensif DevOps merangkumi sejumlah 4 pelajaran.

Mengapa Fail Perantaraan Menjejaskan Daya Pemprosesan

Apabila anda merangkaikan perintah seperti sort file.txt > tmp.txt && uniq tmp.txt > result.txt, anda menanggung kos tersembunyi: penulisan cakera, pembacaan cakera dan saluran paip yang terhenti sehingga peringkat pertama selesai sepenuhnya sebelum peringkat seterusnya bermula.

Saluran paip penstriman menghapuskan kos tersebut. Data mengalir terus daripada penghasil kepada pengguna melalui memori, peringkat demi peringkat, secara serentak. Inilah idea teras di sebalik paip Unix — dan paip bernama (FIFO) mengembangkannya lagi.

  • Paip tanpa nama (|): menyambungkan dua perintah bersebelahan dalam baris shell yang sama.
  • Paip bernama (FIFO): fail khas dalam sistem fail yang membolehkan proses yang tidak berkaitan menstrim data antara satu sama lain.
  • Penggantian proses: membolehkan perintah menganggap keluaran perintah lain sebagai fail.

Pelajaran ini menunjukkan cara menggunakan ketiga-tiganya untuk memaksimumkan daya pemprosesan dalam aliran kerja Bash dunia sebenar.

Anatomi Saluran Paip Penstriman

Paip tanpa nama menyambungkan stdout satu proses kepada stdin proses seterusnya. Kernel memastikan kedua-dua proses berjalan serentak dalam penimbal dalam memori bersaiz tetap (biasanya 64 KB pada Linux).

Kesimpulan penting: kelajuan saluran paip bergantung pada peringkatnya yang paling perlahan. Jika penghasil lebih laju, ia disekat apabila penimbal penuh. Jika pengguna lebih laju, ia disekat apabila penimbal kosong. Tekanan balik ini ialah kawalan aliran percuma dan automatik.

Contoh di bawah mengira alamat IP unik dalam log capaian besar tanpa pernah menulis fail sementara. Setiap peringkat berjalan secara serentak:

#!/usr/bin/env bash
# Stream a 2 GB access log — all stages run in parallel
grep '"GET' /var/log/nginx/access.log \
  | awk '{print $1}' \
  | sort \
  | uniq -c \
  | sort -rn \
  | head -20

Mencipta Paip Bernama dengan mkfifo

Paip bernama (FIFO — First In, First Out) dicipta dengan mkfifo. Paip ini muncul dalam sistem fail seperti fail biasa, tetapi data yang ditulis kepadanya tidak pernah disimpan pada cakera — data mengalir terus kepada proses yang membacanya.

Tingkah laku penting yang perlu diingati:

  • Penulisan kepada FIFO disekat sehingga pembaca membukanya, dan begitu juga sebaliknya.
  • Entri FIFO kekal dalam sistem fail; anda mesti memadamkannya dengan rm apabila selesai.
  • Berbilang penulis dibenarkan, tetapi susunan antara penulis tidak dijamin.

Di bawah: penghasil memampatkan data ke dalam FIFO sementara pengguna memuat naiknya ke S3 secara serentak — tiada fail sementara diperlukan.

#!/usr/bin/env bash
mkfifo /tmp/stream_pipe

# Producer: compress in background
gzip -c /var/log/syslog > /tmp/stream_pipe &

# Consumer: read from FIFO (runs in foreground)
wc -l < /tmp/stream_pipe

wait
rm /tmp/stream_pipe

Penggantian Proses: Menganggap Perintah sebagai Fail

Penggantian proses menggunakan sintaks <(command) atau >(command). Bash mencipta FIFO (atau deskriptor fail /dev/fd/N) di sebalik tabir dan menghantar laluannya kepada perintah luar.

Ini berguna apabila alat menjangkakan argumen nama fail dan bukannya stdin. Tanpa penggantian proses, anda memerlukan fail sementara; dengannya, anda boleh menstrim terus.

  • <(cmd) — perintah luar membaca daripada keluaran cmd.
  • >(cmd) — perintah luar menulis kepada input cmd.
#!/usr/bin/env bash
# diff two sorted streams without creating temp files
diff <(sort /etc/passwd) <(sort /etc/group)

# Compare live command output against a baseline
diff <(ls /usr/bin | sort) <(cat ~/bin_baseline.txt | sort)

tee: Memecahkan Strim kepada Berbilang Pengguna

tee membaca stdin dan menulisnya kepada stdout serta satu atau lebih fail. Apabila digabungkan dengan penggantian proses, anda boleh menghalakan satu strim kepada berbilang saluran paip pemprosesan secara serentak — semuanya tanpa menyentuh cakera.

Corak ini berguna apabila anda mahu, contohnya, merekodkan data mentah dan memprosesnya pada masa yang sama.

#!/usr/bin/env bash
# Generate 100000 random numbers, then simultaneously:
#  1. compute the sum
#  2. find the maximum
#  3. count lines (saved to a variable)
seq 1 100000 \
  | tee >(awk '{s+=$1} END{print "Sum:", s}') \
        >(awk 'BEGIN{m=0} $1>m{m=$1} END{print "Max:", m}') \
  | wc -l | xargs echo "Count:"

Corak Fan-Out: Satu Penghasil, Banyak Pengguna

Apabila satu sumber data perlu membekalkan berbilang pengguna bebas, gabungkan tee dengan berbilang penggantian proses >(). Setiap pengguna menerima strim penuh dan berjalan secara serentak.

Ini mengelakkan pembacaan fail sumber berulang kali. Bagi fail 10 GB, perbezaannya amat besar — satu pembacaan cakera dan bukannya N pembacaan.

#!/usr/bin/env bash
# Read a large CSV once; simultaneously:
#  - count rows
#  - extract column 2 to a file
#  - pass column 3 to a stats script
cat large_data.csv \
  | tee \
      >(wc -l > /tmp/row_count.txt) \
      >(cut -d',' -f2 > /tmp/col2.txt) \
      >(cut -d',' -f3 | awk '{sum+=$1} END{print sum}' > /tmp/col3_sum.txt) \
  > /dev/null

echo "Rows:" $(cat /tmp/row_count.txt)
echo "Col3 sum:" $(cat /tmp/col3_sum.txt)

Corak Fan-In: Banyak Penghasil, Satu Pengguna

Lawan fan-out ialah fan-in: berbilang sumber bebas menstrim ke dalam satu pengguna. FIFO bernama menjadikan perkara ini mudah dilakukan.

Kes penggunaan biasa: menggabungkan strim log daripada beberapa pelayan dalam masa nyata, atau mengagregat hasil separa daripada pekerja selari.

Perhatikan bahawa dengan berbilang penulis, pengguna akan melihat keluaran yang bercampur — tiada masalah untuk data berorientasikan baris yang setiap barisnya lengkap sendiri, tetapi anda perlu mengendalikan susunan sendiri jika urutan penting.

#!/usr/bin/env bash
mkfifo /tmp/fanin_pipe

# Three producers write concurrently into the same FIFO
for host in web1 web2 web3; do
  ssh "$host" 'tail -n 500 /var/log/app.log' > /tmp/fanin_pipe &
done

# Single consumer reads all merged output
grep 'ERROR' /tmp/fanin_pipe | sort | uniq -c | sort -rn

wait
rm /tmp/fanin_pipe

Menggunakan mkfifo untuk Pemampatan Selari

Salah satu penggunaan FIFO yang paling praktikal ialah pemampatan selari. Alat seperti pigz (gzip selari) atau pbzip2 membaca strim; anda boleh menyalurkan data mentah secara terus tanpa menyediakan fail tidak dimampatkan.

Corak di bawah mengarkibkan direktori, memampatkannya menggunakan semua teras CPU dan menstrim hasilnya ke hos jauh — semuanya secara serentak:

#!/usr/bin/env bash
# Tar + parallel compress + stream to remote — no temp files
# Requires: pigz (parallel gzip)
tar cf - /data/large_dir \
  | pigz -p 4 \
  | ssh backup-host 'cat > /backups/large_dir.tar.gz'

# Verify the remote file exists
ssh backup-host 'ls -lh /backups/large_dir.tar.gz'

Mengawal Saiz Penimbal dan Penyekatan

Paip mempunyai penimbal kernel (biasanya 64 KB). Apabila penimbal penuh, penulis disekat; apabila kosong, pembaca disekat. Biasanya inilah yang anda mahukan, tetapi dalam sesetengah keadaan penyekatan boleh menyebabkan kebuntuan.

Risiko kebuntuan: jika proses A menulis kepada FIFO1 dan membaca daripada FIFO2, manakala proses B menulis kepada FIFO2 dan membaca daripada FIFO1, kedua-duanya mungkin disekat kerana menunggu proses yang satu lagi membaca terlebih dahulu.

Penyelesaian:

  • Letakkan sekurang-kurangnya satu sisi di latar belakang (&) supaya ia tidak menyekat shell.
  • Gunakan mbuffer atau pv untuk menambah penimbal dalam memori yang lebih besar antara peringkat.
  • Gunakan pv -q -B 128m untuk memasukkan penimbal 128 MB yang melancarkan lonjakan daya pemprosesan.
#!/usr/bin/env bash
# pv adds a 64 MB buffer and shows throughput
# Useful when producer and consumer have bursty speeds
dd if=/dev/urandom bs=1M count=200 \
  | pv -B 64m \
  | gzip \
  | wc -c

Contoh Praktikal: Pengagregat Log Masa Nyata

Berikut ialah corak lengkap yang realistik: ikuti berbilang fail log, gabungkan strim melalui paip bernama, tapis ralat dan tulis ringkasan langsung — semuanya tanpa fail perantaraan dan dengan semua peringkat berjalan secara selari.

Saluran paip sebegini biasanya dijalankan sebagai skrip pemantauan latar belakang pada pelayan pengeluaran.

#!/usr/bin/env bash
FIFO=/tmp/log_aggregator
mkfifo "$FIFO"

cleanup() { rm -f "$FIFO"; }
trap cleanup EXIT INT TERM

# Fan-in: tail multiple logs into the FIFO
tail -F /var/log/syslog /var/log/auth.log > "$FIFO" &
TAIL_PID=$!

# Consumer: filter and timestamp errors in real time
grep --line-buffered -i 'error\|fail\|crit' "$FIFO" \
  | while IFS= read -r line; do
      printf '[%s] %s\n' "$(date '+%H:%M:%S')" "$line"
    done

kill "$TAIL_PID" 2>/dev/null

Menanda Aras Saluran Paip berbanding Fail Sementara

Anda boleh mengukur perbezaan daya pemprosesan sebenar antara pendekatan penstriman dengan pendekatan fail sementara menggunakan time. Pendekatan saluran paip lebih baik untuk set data besar kerana:

  • Peringkat berjalan secara serentak — CPU dan I/O bertindih.
  • Tiada I/O cakera untuk data perantaraan — hanya keluaran akhir ditulis ke cakera.
  • Jejak memori kekal malar tanpa mengira saiz input (strim, bukannya penimbal).

Penanda aras mudah untuk membandingkan kedua-dua pendekatan:

#!/usr/bin/env bash
# Approach 1: Temp file (sequential)
time bash -c '
  seq 1 5000000 > /tmp/nums.txt
  sort -n /tmp/nums.txt > /tmp/sorted.txt
  uniq /tmp/sorted.txt | wc -l
  rm /tmp/nums.txt /tmp/sorted.txt
'

echo '---'

# Approach 2: Streaming pipeline (concurrent)
time bash -c 'seq 1 5000000 | sort -n | uniq | wc -l'

Semakan Pengetahuan: Tingkah Laku Penyekatan Paip Bernama

Pertimbangkan skrip berikut:

mkfifo /tmp/mypipe
echo 'hello' > /tmp/mypipe
echo 'done'

Apakah yang berlaku apabila skrip ini dijalankan tanpa proses latar belakang atau pembaca?

Imbas Kembali: Saluran Paip Penstriman dan Paip Bernama

Dalam pelajaran ini, anda meneroka cara memindahkan data dengan cekap antara proses tanpa fail perantaraan:

  • Paip tanpa nama (|) menyambungkan perintah bersebelahan dan menjalankan semua peringkat secara serentak dengan tekanan balas automatik.
  • Paip bernama (mkfifo) mencipta entri sistem fail FIFO yang membolehkan proses yang tidak berkaitan atau berjalan di latar belakang menstrim data antara satu sama lain — penulisan disekat sehingga terdapat pembaca.
  • Penggantian proses (<(cmd), >(cmd)) membolehkan perintah yang menjangkakan nama fail menggunakan atau menghasilkan strim secara telus.
  • tee + >() membahagikan satu strim kepada berbilang penerima serentak tanpa membaca semula sumber.
  • Penggabungan masuk menggabungkan berbilang pengeluar kepada satu penerima melalui FIFO yang dikongsi.
  • Tekanan balas dan penyekatan ialah ciri, bukannya pepijat — tetapi sentiasa jalankan sekurang-kurangnya satu sisi pasangan FIFO di latar belakang untuk mengelakkan kebuntuan.
  • Gunakan pv atau mbuffer untuk menambah penimbal yang lebih besar dan memantau kadar pemprosesan apabila peringkat berjalan secara berkelompok.

Teknik ini ialah asas kejuruteraan data Bash berdaya pemprosesan tinggi: proses data berskala GB dengan memori malar serta keselarian CPU/IO maksimum.

Percuma untuk bermula

Pelajari Kem Intensif DevOps dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
142
Pelajaran
568

Soalan Lazim

Adakah pelajaran “Saluran Paip Penstriman dan Paip Bernama untuk Daya Pemprosesan” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Kem Intensif DevOps, termasuk “Saluran Paip Penstriman dan Paip Bernama untuk Daya Pemprosesan”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Kem Intensif DevOps merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Saluran Paip Penstriman dan Paip Bernama untuk Daya Pemprosesan”?

Gunakan FIFO dan penggantian proses untuk menstrim data antara peringkat tanpa fail perantara Anda berlatih Kem Intensif DevOps menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Kem Intensif DevOps?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Kem Intensif DevOps di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.

Berapa lamakah pelajaran “Saluran Paip Penstriman dan Paip Bernama untuk Daya Pemprosesan” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Kem Intensif DevOps ini?

Ya. Setiap pelajaran Kem Intensif DevOps menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Menganalisis Prestasi Skrip dan Mengelakkan Subcangkerang Tidak Berguna
  2. Pemprosesan Selari dengan xargs -P dan Kerja Latar Belakang
  3. Mengatur Beban Kerja dengan GNU parallel
  4. Saluran Paip Penstriman dan Paip Bernama untuk Daya Pemprosesan
← Kembali ke Kem Intensif DevOps