มาใช้ Parallelization ลดเวลารันงานกันเถอะ

เจองานที่นึงใช้ stored procudure รัน 400,000 งาน แบบวนลูป 400,000 รอบ โดยแต่ละงานเป็นอิสระกันทั้งการประมวลผลและข้อมูล เลยแนะนำให้ปรับเป็น parallelization กระจายงานไปรันในหลายคอร์ซีพียู

nl = j / (nc * 2)

nl = จำนวนลูปทั้งหมด
j = จำนวนงาน
nc = จำนวนคอร์ซีพียู

สมมติปัจจุบัน 1 วินาทีรันได้ 20 งาน เท่ากับต้องใช้เวลาทั้งหมด 400,000 / 20 / 3,600 = 5.55 ชั่วโมง
รันลูป 1 รอบต่อ 1 งาน ใช้เวลา 1/20 = 0.05 วินาที

สมมติเครื่องมีซีพียู 32 คอร์ ปกติ 1 คอร์รันได้ 2 thread
จำนวนลูปเหลือ -> 400,000 / (32 * 2) = 6,250 รอบ
รันลูป 1 รอบต่อ 64 งานใช้เวลา 0.05 วินาที (ไม่นับรวมการเข้าถึง shared hardware resources เช่น memory, I/O, network ฯ)
เท่ากับต้องใช้เวลาทั้งหมด 6,250 * 0.05 = 5.208 นาที

จาก 5 ชั่วโมงครึ่ง เหลือ 5 นาที !!!!

หรือคำนวณง่ายๆ -> (400,000 * 0.05) / 64 = 312.5 วินาที หรือ 5 นาที 12 วินาที

NOTE: การออกแบบ parallelization ต้องมีความเข้าใจพื้นฐานหลายด้าน เช่น pass by value, pass by reference, object reference, object propery & state, CPU, memory, I/O (bus หรือ PCI lane), multiprocessing, multithreading, latency, race condition/mutually exclusive, synchronization, ฯลฯ

ถ้าเป็น parallelization ผสม distributed computing ที่ต้องกระจายงานไปรันหลายเครื่อง อันนี้ก็จะปวดหัวเพิ่มนิดนึง ต้องเข้าใจเพิ่มพวก network computing, master-slaves, event-driven, proactor-reactor, stub-skeleton, distributed data, share data

ใส่ความเห็น