วันพฤหัสบดีที่ 8 เมษายน พ.ศ. 2553

Delay Pools Squid

เกริ่นไว้ก่อนนะครับ สำหรับท่าน Admin ที่ดูแลระบบแล้วมีปัญหาเรื่อง User ชอบดาวโหลดโน่น ดาวโหลดนี่ จนทำให้เครือข่ายท่านช้า ใช้งานอินเทอร์เน็ตกันไม่ได้เลย ก็มีวิธีแก้ไขต่าง ๆ นา ๆ แต่ที่จะนำมาให้ดูในวันนี้ก็คือเรื่องของการบีบแบนด์วิธ แบบง่าย ๆ (แต่เล่นเอางงเหมือนกัน) มาให้ดูครับ

อย่างแรกต้องทำความเข้าใจเรื่องความเร็วอินเทอร์เน็ตก่อนนะครับ สมมุติ ใช้ความเร็วอินเทอร์เน็ต 2M

2M = 2048 Kb/sec หรือ 204800 byte/s (ไบท์เปอเซ็ก)

ถ้าถามว่าเน็ต 2 M จะดาวโหลดจริง ๆ ได้ความเร็วเท่าไหร่ ให้เอา 8 ไปหารครับ (แปดมาจากไหน ?? ก็ 1 byte = 8 bit ไง)
2048/8 = 256 KB/s (เคยโหลดบิตกันใช่มั้ยครับ สงสัยมั้ยครับว่าติดเน็ต 2 M ทำไมวิ่งเต็มที่แค่ 200 กว่า ๆ นี่แหละคือสาเหตุ)

แต่หน่วยที่เราจะเอาไปกรอกใน squid จะต้องเป็นหน่วย Byte ครับ ดังนั้นให้สมมุติค่าความเร็วจริง ที่คุณต้องการไว้เลย เช่น ผมต้องการให้ดาวโหลดได้ไม่เกิน 15 KB/s ดังนั้นค่าที่จะนำไปกรอกใน squid ต้อง x ด้วย 1024 เข้าไปเพื่อจะได้หน่วยออกมาเป็น byte

15 x 1024 = 15360 byte/s

ต่อไปก็เรื่องของ pools และ class ใน squid.conf ก็มีอธิบายอยู่ ผมจะอธิบายแบบง่าย ๆ ให้ฟังนะครับ

pools ก็จำนวนเงื่อนไขที่เราจะสร้างขึ้น เช่น delay pools 3 หมายความว่ามี 3 เงื่อนไข
class เป็นเรื่องของการจำกัดแบนด์วิธ ว่าจะมีกี่แบบ (ต้องอ่านคอมเม้นใน squid.conf) มันจะทำงานคู่กับ parameter เช่น
delay_class 1 1
delay_parameters 1 5120/5120
#หมายความว่า เป็น pools ที่ 1 แบบ มีคลาสเดียว สังเกตุที่ 5120/5120 มีชุดเดียว

delay_class 3 2
delay_parameters 1 51200/51200 5120/5120
#หมายความว่า เป็น pools ที่ 3 แบบ 2 คลาส การกำหนดความเร็วจะมี 2 ชุด ***กำหนดสูงสุดได้ 3 Class เท่านั้น ***


-------------------------------------------------------------------------------------------------------------------------------------------

โจทย์
ระบบเครือข่ายแห่งนึงมีอินเทอร์เน็ท ADSL 2M ต้องการให้เครื่องลูกข่ายใช้งานได้เพียง 1M เพื่อสงวนแบนด์วิธที่เหลือไว้ใช้กับกลุ่มของ Server ที่ต่อแบบ DMZ และต้องการให้เครื่องลูกข่ายที่มีนักดาวโหลด ดาวโหลดไฟล์มัลติมีเดีย ต่าง ๆ ได้เพียงแค่ 5KB/s และไฟล์บีดอัดต่าง ๆ 15KB/s ส่วนไฟล์บีบอัดจะบีบมากก็ไม่ได้ เพราะต้องเหลือแบนบิทรวมไว้บ้าง ซึ่งบาง User อาจโหลดงาน แต่ไฟล์มาเป็น zip ดังนั้นจำเป็นต้องให้แบนด์วิธรวมไว้ที่ 48 Kb/s จะต้องทำอย่างไรบ้าง.. ?

คำนวณกันก่อนเลย
- 1M = 1024 Kb/s เมื่อหารด้วย 8 ก็จะได้ความเร็วจริง = 128 KB/s
ความเร็วที่จะเขียนลงใน squid จะได้่ 128x1024 = 131072 byte/s

- ไฟล์มัลติมีเดียร์ 5KB/s จะได้ 5 x 1024 = 5120 byte/s
- ไฟล์บีดอัดต่าง ๆ 15K/b จะได้ 15 x 1024 = 15360 byte/s



ต่อไปเป็นโค้ดที่จะเขียนลงใน squid แล้วนะครับ เครื่องหมาย # คือคอมเม้นนะครับ


อ้างถึง

acl limitdown1 url_regex -i .mp3 .ogg .wav .wma .3gp .avi .mov .mp4 .mpeg .mpg .wma .mkv .divx .vob .iso .nrg
acl limitdown2 url_regex -i .zip .rar .7z .exe .msi

#ประกาศกลุ่ม ของไฟล์ต่าง ๆ ชื่อว่า limitdown1 และ limitdown2 (ตั้งชื่ออะไรก็ได้แต่ไปใส่ด้านล่างให้ถูกด้วย) โดยมีนามสกุลต่าง ๆ เพิ่มเติมลงไปได้ตามต้องการ อย่าใส่เยอะนะครับเพราะมันทำให้ squid อาจทำงานหนักได้


# ต่อไปค้นหากลุ่มของ Delay Pools นะครับ แล้วพิมพ์คำสั่งที่เหลือต่อเลยครับ
อ้างถึง
delay_pools 3

# กำหนดให้มี 3 รูปแบบ

อ้างถึง

delay_class 1 2 #
delay_parameters 1 5120/5120 5120/5120
delay_access 1 allow limitdown1
delay_access 1 deny all

#เงื่อนไข ที่ 1 มี 2 คลาส โดยกำหนดให้ กลุ่ม acl ที่ชื่อว่า limitdown1 มีแบนด์วิธรวมทั้งเครือข่ายได้แค่ 5KB/s (โหดสาดด) และดาวโหลดสูงสุดต่อเครื่องก็ได้แค่ 5KB/s ดังนั้นถ้ามีคนโหลด mp3 ณ ช่วงเวลานั้น ๆ เพียงคนเดียวก็จะวิ่งเต็มที่ 5KB/s แต่ถ้ามีคนอื่นมาโหลดพร้อมกัน มันก็จะหารลงไปอีก จาก 5KB/s



อ้างถึง

delay_class 2 2
delay_parameters 2 49152/49152 15360/15360
delay_access 2 allow limitdown2
delay_access 2 deny all

#เงื่อนไข ที่ 2 มี 2 คลาส โดยกำหนดให้ กลุ่ม acl ที่ชื่อว่า limitdown2 มีแบนด์วิธรวมทั้งเครือข่ายได้แค่ 15KB/s และดาวโหลดสูงสุดต่อเครื่องก็ได้แค่ 15KB/s ดังนั้นถ้ามีคนโหลด .rar ณ ช่วงเวลานั้น ๆ เพียงคนเดียวก็จะวิ่งเต็มที่ 15KB/s แต่ถ้ามีคนอื่นมาโหลดพร้อมกัน ไม่เกิน 3 คน ก็จะยังวิ่งที่ 15Kb/s แต่ถ้าเกิน 3 คน ก็จะลดหลั่นกันไป (กลุ่มนี้เป็นไฟล์คาบเกี่ยวระหว่าง พวกชอบโหลดโปรแกรมมาเล่น และพวกที่โหลดงาน แต่มาเป็นไฟล์ zip หรือ rar จึงต้องยืดหยุ่นกันหน่อย)


อ้างถึง

delay_class 3 2
delay_parameters 3 131072/131072 131072/131072
delay_access 3 allow localhost
delay_access 3 deny all

#เงื่อนไข ที่ 3 มี 2 คลาสเช่นกัน โดยกำหนดให้ กลุ่ม acl ที่ชื่อว่า localhost (ปกติ squid จะประกาศเป็นค่ามาตรฐานไว้แล้ว) มีแบนท์วิธรวมในการใช้งานอินเทอร์เน็ต ที่ไม่เกี่ยวข้องกับ 2 เงื่อนไขบน วิ่งกันได้ที่ความเร็ว 128 Kb/s ต่อเครื่อง และใช้งานรวมทั้งองค์กร 128 KB/s เช่นกัน เพราะฉนั้นถ้าเล่นเน็ตอยู่คนเดียว ก็เรียกได้ว่าเร็ว สุด ๆ แต่ถ้าเล่นพร้อม ๆ กัน ก็จะแชร์ความเร็วลงไป ..


# สังเกตนะครับว่าทุก pools ผมจะกำหนดให้ใช้ delay_class แบบ 2 คลาส (สังเกตุจะมีเลข xx/xx xxx/xxx อยู่ 2 ชุด)
# ชุดแรก หมายถึง Bandwidth รวมทั้งวงเน็ตเวิร์ค ที่เราอนุญาตให้โหลด
# ชุดสอง หมายถึง Bandwidth ของแต่ละเครื่อง ที่เราอนุญาตให้โหลด


-------------------------------------------------------------------------------------------------------------------------------
เพิ่มเติมให้นิดหน่อย ในเงื่อนไขที่ 3 หากต้องการความเร็วแบบ unlimit แนะนำให้ใส่ -1/-1 ลงไปแทนการกรอกตัวเลขครับ
อ้างถึง

delay_class 3 1
delay_parameters 3 -1/-1
delay_access 3 allow localhost
delay_access 3 deny all

# หมายความว่าเงื่อนไขที่ 3 แบบ 1 คลาส ปล่อยให้เครื่องลูกดาวโหลดได้แบบ unlimit โดยไม่มีการแบ่งรายเครื่อง หรือรายเครือข่าย ซึ่งความเร็วเน็ตก็จะถูกแบ่งปันแบบอัตโนมัติครับ

อ้างถึง
# For example, if delay pool number 1 is a class 2 delay pool as in the
# above example, and is being used to strictly limit each host to 64kbps
# (plus overheads), with no overall limit, the line is:
#
#delay_parameters 1 -1/-1 8000/8000
#
# Note that the figure -1 is used to represent "unlimited".


!! ถ้าดูจากคอมเม้นของ squid อาจจะดูแย้ง ๆ กันหน่อย มันบอกว่าลิมิตสำหรับ host ไว้แค่ 64 เมื่อคิดดูแล้ว 8*8 ก็ได้ 64 จริง ที่เท่าที่ผมลองทำดูวิธีแบบที่ผมทำมันก็ได้ผลอยู่นะ !!




ขอ จบเรื่อง Delay Pools เพียงแค่นี้ละครับ ผิดพลาดประการใดต้องขออภัยมา ณ. ที่นี้ด้วย เพราะบนความนี้ผมได้ทดลองด้วยตัวเอง (จนคิดว่าชัวแล้ว) เพราะไปอ่าน ๆ มาจากหลาย ๆ สำนักก็ยัง งง เลยต้องเอามารวม ๆ ประยุกต์และปรับใช้กับความคิดผมเองเลยได้มาเป็นดังตัวอย่าง