GNU Parallel: “Tăng tốc” xử lý tác vụ Linux lên gấp 10 lần

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

Server 16 core mà chạy script mất cả buổi chiều?

Bạn đã bao giờ ngồi đợi hàng tiếng đồng hồ chỉ để nén vài nghìn tấm ảnh hay parse hàng chục GB log server chưa? Nếu câu trả lời là “rồi”, bài viết này chính là dành cho bạn. Hồi mới vào nghề, mình thường dùng vòng lặp for đơn giản trong Bash. Có lần mình cần convert 20.000 tấm ảnh trên con server 16 cores. Kết quả là script chỉ chạy đúng trên 1 core, còn 15 core kia thì… ngồi chơi, khiến mình mất nguyên một buổi chiều chỉ để nhìn màn hình terminal chạy túc tắc.

Mọi chuyện thay đổi khi mình biết đến GNU Parallel. Nó đóng vai trò như một trạm điều phối, tự động “xẻ” việc cho tất cả core CPU hiện có. Thay vì chạy lần lượt từng lệnh, chúng ta sẽ ép server làm việc hết công suất, giúp công việc hoàn thành nhanh gấp 5, thậm chí gấp 10 lần tùy vào cấu hình máy.

Cài đặt GNU Parallel trong “một nốt nhạc”

Để bắt đầu, hãy cài đặt nó vào hệ thống. GNU Parallel có sẵn trong kho ứng dụng của hầu hết các distro Linux phổ biến.

# Ubuntu / Debian
sudo apt update && sudo apt install parallel -y

# CentOS / RHEL / Fedora
sudo dnf install parallel -y

# Arch Linux
sudo pacman -S parallel

Thử ngay một lệnh đơn giản để thấy cách nó vận hành:

parallel echo ::: 1 2 3 4 5

Ở đây, dấu ::: dùng để phân tách lệnh và các đầu vào. Thay vì in ra 1, 2, 3, 4, 5 tuần tự như rùa bò, Parallel sẽ ném chúng vào các tiến trình khác nhau để xử lý đồng thời.

Hãy xem một ví dụ thực tế hơn: Bạn có 50 file log nén .gz nặng khoảng 10GB và cần giải nén chúng gấp.

ls *.gz | parallel gunzip

Thay vì gunzip từng file một cách chậm chạp, lệnh trên sẽ kích hoạt nhiều tiến trình chạy cùng lúc. Bạn sẽ thấy CPU load tăng vọt, nhưng bù lại, thời gian chờ đợi sẽ giảm xuống chỉ còn vài phút.

Tại sao GNU Parallel lại “ăn đứt” xargs hay vòng lặp for?

Có thể bạn sẽ tự hỏi: “Dùng xargs -P cũng chạy song song được mà?”. Thực tế là Parallel thông minh và an toàn hơn nhiều. Sau nhiều năm quản lý hệ thống VPS, mình ưu tiên Parallel vì 3 điểm “ăn tiền” sau:

  • Giữ nguyên thứ tự output: Với xargs, kết quả in ra terminal sẽ cực kỳ hỗn loạn tùy thằng nào xong trước. Parallel sẽ gom lại và trả kết quả đúng thứ tự đầu vào, điều này cực kỳ quan trọng khi bạn cần xuất dữ liệu ra file báo cáo.
  • Chấp hết tên file có dấu cách: Tên file có khoảng trắng là “ác mộng” khi viết script Bash. Parallel xử lý việc này cực mượt mà không cần dùng đến các trick -0 hay IFS phức tạp.
  • Phân phối việc qua SSH: Đây là tính năng đỉnh nhất. Bạn có thể đẩy lệnh sang 3-4 server khác qua SSH để tận dụng tài nguyên của cả một cụm server cùng lúc.

3 kịch bản ứng dụng “thực chiến” nhất

1. Resize ảnh hàng loạt cho Web

Nếu bạn cần resize toàn bộ kho ảnh 5GB trong folder xuống còn 800px bằng ImageMagick, dùng Parallel sẽ giúp bạn tiết kiệm được cả khối thời gian:

ls *.jpg | parallel convert {} -resize 800x800 {.}__resized.jpg

Trong đó:

  • {}: Là biến đại diện cho tên file hiện tại.
  • {.}: Tên file đã lược bỏ phần mở rộng (giúp bạn tạo file mới dễ dàng).

2. Download dữ liệu tốc độ cao

Bạn có một danh sách 100 URL trong file links.txt? Thay vì dùng wget tải từng file một, hãy thử cách này:

cat links.txt | parallel -j 10 wget {}

Tham số -j 10 yêu cầu Parallel chạy tối đa 10 luồng tải xuống cùng lúc. Tốc độ download sẽ nhanh hơn đáng kể, nhưng nhớ đừng đặt số quá lớn kẻo bị server đích chặn IP vì tưởng bị tấn công DDoS nhé!

3. Quét log tìm lỗi cực nhanh

Khi cần tìm từ khóa ‘ERROR’ trong hàng trăm file log cũ đã nén, mình thường dùng:

ls access.log.*.gz | parallel "zgrep 'ERROR' {} >> errors.txt"

Kiểm soát tài nguyên: Đừng để server “sập”

Khi làm việc trên server đang chạy production, bạn không thể cứ thế ném lệnh ra rồi mặc kệ nó chiếm sạch 100% CPU. Một mẹo nhỏ là giới hạn số lượng jobs theo tỷ lệ core:

parallel --jobs 50% ... # Chỉ dùng 50% số core hiện có

Hoặc nếu task của bạn nặng và dễ lỗi, hãy dùng tính năng --joblog để theo dõi trạng thái:

parallel --joblog my_tasks.log ./my_script.py ::: input1 input2 input3

Nếu chẳng may server sập hoặc bạn muốn tạm dừng, lần sau chỉ cần thêm flag --resume. Parallel sẽ chỉ chạy nốt những phần việc còn dang dở trong my_tasks.log, cực kỳ tiện lợi cho các tác vụ chạy xuyên đêm.

Kinh nghiệm “xương máu” khi chạy song song

Mặc dù Parallel rất mạnh, nhưng từ trải nghiệm thực tế, các bạn cần lưu ý 3 điều:

  1. Coi chừng nghẽn ổ cứng (Disk I/O): Nếu task của bạn ghi dữ liệu quá nặng (như copy file dung lượng lớn), chạy song song nhiều tiến trình có khi còn chậm hơn chạy đơn nhiệm. Lúc này ổ cứng phải xoay đầu đọc/ghi liên tục dẫn đến tình trạng I/O Wait cao.
  2. Kiểm soát RAM: Mỗi tiến trình sinh ra đều ngốn một lượng RAM nhất định. Nếu bạn chạy 50 luồng mà mỗi luồng chiếm 1GB RAM trên con server 16GB, hệ thống chắc chắn sẽ treo cứng.
  3. Luôn thử trước với Dry-run: Trước khi bấm Enter chạy thật, hãy thêm flag --dry-run để xem các lệnh sẽ được thực thi như thế nào. Tránh trường hợp sai một li đi luôn cả dữ liệu.
parallel --dry-run echo {} ::: test1 test2

Chốt lại, GNU Parallel là công cụ buộc phải biết nếu bạn muốn làm việc chuyên nghiệp trên Linux. Nó biến những tác vụ nhàm chán, tốn thời gian trở nên nhanh gọn và hiệu quả hơn hẳn. Hãy thử áp dụng vào dự án tiếp theo của bạn, mình tin là bạn sẽ bất ngờ với hiệu suất mà nó mang lại.

Share: