ปรับ refresh pattern เพิ่มอัตรา hit ของ squid

squid เป็นหนึ่งในซอฟต์แวร์ที่มีค่าคอนฟิกเยอะมาก และมีเกร็ดการ fine-tune เยอะแยะไปหมด เพื่อนสมาชิกที่มีประสบการณ์ก็สามารถมาแชร์เป็นวิทยาทานกันได้นะครับ

ผมเองไม่มีประสบการณ์การ fine-tune squid มากนัก แต่เร็ว ๆ นี้ ได้ไปเจอ เคล็ดวิชา refresh pattern มา และใช้ได้ผลพอประมาณ เลยเอามาเล่าสู่กันฟัง

refresh pattern เป็นตัวกำหนดว่าจะให้อะไรเก่าอะไรใหม่สำหรับแคชและการตอบกลับ ซึ่งโดยหลักการแล้ว คุณควรจะให้ squid เชื่อตาม HTTP header ต่าง ๆ ที่เว็บเซิร์ฟเวอร์ตอบกลับมา ว่าอะไรเก่าอะไรใหม่ขนาดไหน แต่โชคไม่ดีที่ค่าต่าง ๆ เหล่านี้มักตอบมาตามค่า default ของเว็บเซิร์ฟเวอร์ ซึ่งไม่ช่วยอะไรนักสำหรับการทำแคช ดังนั้น การปรับ refresh pattern จึงช่วยได้ในเรื่องนี้

refresh pattern ใน squid.conf จะอยู่ในรูปแบบ:

refresh_pattern [-i] regex min percent max [options]

โดยที่

  • regex คือนิพจน์เรกิวลาร์แทน URL ที่จะเข้ากฎ โดยปกติจะ case sensitive ยกเว้นเมื่อมีตัวเลือก -i
  • min คืออายุที่ต่ำที่สุด (เป็นนาที) ของอ็อบเจกต์ที่จะเริ่มพิจารณาความเก่าใหม่ โดยถ้าต่ำกว่านี้จะถือว่าใหม่เสมอ (ยกเว้นว่ามีการกำหนดเวลาหมดอายุมาใน HTTP header)
  • max คืออายุที่สูงที่สุด (เป็นนาที) ของอ็อบเจกต์ที่จะยังคงพิจารณาความเก่าใหม่อยู่ โดยถ้าสูงกว่านี้จะถือว่าเก่าเสมอ
  • percent คือเปอร์เซ็นต์ของอายุในแคชของอ็อบเจกต์นับตั้งแต่ refresh ครั้งล่าสุด เทียบกับอายุจริงของอ็อบเจกต์ตามที่เว็บเซิร์ฟเวอร์รายงาน ที่จะยังคงถือว่าอ็อบเจกต์นั้นยังใหม่อยู่
  • options คือตัวเลือกเพิ่มเติม ซึ่งจะกล่าวถึงในภายหลัง

ตัวอย่างเช่น

refresh_pattern -i \.gif$ 1440 20% 10080

หมายความว่า:

  • ถ้าอ็อบเจกต์ *.gif มี header ระบุเวลาหมดอายุ ก็เชื่อถือตาม header นั้น จบ ถ้าไม่มี จึงพิจารณาต่อไป
  • ถ้าอ็อบเจกต์อยู่ในแคชต่ำกว่า 1440 นาที (1 วัน) ถือว่ายังใหม่อยู่ ใช้ค่าในแคชตอบกลับได้ทันที
  • ถ้าอ็อบเจกต์อยู่ในแคชมานานเกิน 10080 นาที (7 วัน) ถือว่าเก่าแล้ว ให้ดึงอ็อบเจกต์มาใหม่จากเว็บเซิร์ฟเวอร์
  • ถ้าอายุในแคชของอ็อบเจกต์อยู่ระหว่าง 1440-10080 นาที ให้พิจารณาอายุในแคช ว่าถึง 20% ของอายุจริงหรือไม่ เช่น ถ้าเว็บเซิร์ฟเวอร์รายงานมาว่าอ็อบเจกต์นี้สร้างขึ้นเมื่อ 10,000 นาทีที่แล้ว ก็พิจารณาว่าอ็อบเจกต์อยู่ในแคชมานานถึง 20% ของ 10,000 คือ 2,000 นาทีหรือไม่ ถ้ายังไม่ถึง ก็ถือว่ายังใหม่ ถ้าถึง ก็ถือว่าเก่าแล้ว

ส่วน options หรือตัวเลือกเพิ่มเติม ส่วนใหญ่จะเป็นการพยายามละเมิดมาตรฐาน HTML เพื่อเพิ่มอัตราการแคช จึงควรระมัดระวังในการใช้งาน ตัวเลือกมีดังนี้:

  • override-expire -- ไม่ต้องสนใจ header ระบุเวลาหมดอายุที่เว็บเซิร์ฟเวอร์บอกมา (พิจารณาตามกฎเสมอ)
  • override-lastmod -- ไม่สนใจ header ระบุเวลาเปลี่ยนแปลงล่าสุดที่เว็บเซิร์ฟเวอร์บอกมา (ถือว่าอ็อบเจกต์มีอายุจริงเท่ากับ min แม้จะเพิ่งเปลี่ยนแปลงใหม่)
  • reload-into-ims -- เปลี่ยน request "no-cache" จากลูกข่ายให้เป็น If-Modified-Since
  • ignore-reload -- ไม่สนใจ header "no-cache" จากลูกข่าย และจะใช้ข้อมูลในแคชถ้าทำได้
  • ignore-no-cache -- ไม่สนใจ header "Pragma: no-cache" และ "Cache-control: no-cache" ที่ส่งมาจากเว็บเซิร์ฟเวอร์ ซึ่ง HTTP RFC ไม่ได้อนุญาตให้เว็บเซิร์ฟเวอร์ทำ แต่ก็มักจะทำกัน
  • ignore-no-store -- ไม่สนใจ header "Cache-control: no-store" ที่ส่งมาจากเว็บเซิร์ฟเวอร์
  • ignore-private -- ไม่สนใจ header "Cache-control: private" ที่ส่งมาจากเว็บเซิร์ฟเวอร์
  • ignore-auth -- เก็บอ็อบเจกต์ที่ต้องผ่านการยืนยันตัวบุคคลของผู้อ่านลงแคชด้วย
  • refresh-ims -- ส่ง request If-Modified-Since ไปที่เว็บเซิร์ฟเวอร์เมื่อผู้ใช้ refresh หน้าเว็บ

คุณสามารถปรับ refresh pattern ให้เก็บอ็อบเจกต์ที่มักไม่มีการเปลี่ยนแปลง เช่น รูปภาพ เสียง วีดิทัศน์ แฟ้มโปรแกรม แฟ้มบีบอัด ฯลฯ ให้อยู่ในแคชนานขึ้นได้ เพื่อเพิ่มอัตราการ hit เช่น (คัดลอกมาจากบทความต้นตอ):

refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i \.(gif|png|jpg|jpeg|ico)$ \
  10080 90% 43200 override-expire ignore-no-cache ignore-no-store ignore-private
refresh_pattern -i \.(iso|avi|wav|mp3|mp4|mpeg|swf|flv|x-flv)$ \
  43200 90% 432000 override-expire ignore-no-cache ignore-no-store ignore-private
refresh_pattern -i \.(deb|rpm|exe|zip|tar|tgz|ram|rar|bin|ppt|doc|tiff)$  \
  10080 90% 43200 override-expire ignore-no-cache ignore-no-store ignore-private
refresh_pattern -i \.index.(html|htm)$ 0 40% 10080
refresh_pattern -i \.(html|htm|css|js)$ 1440 40% 40320
refresh_pattern . 0 40% 40320

กฎจะถูกนำมาตรวจสอบเรียงทีละกฎจากบนลงล่าง จนกว่าจะพบกฎแรกที่ตรง ก็จะใช้กฎนั้นและหยุดตรวจสอบต่อ ดังนั้น กฎสุดท้ายจึงเป็นกฎที่เอาไว้รองรับแพตเทิร์นที่เหลือโดยทั่วไป และมักจะแยกกฎสำหรับโพรโทคอลอื่นอย่างเช่น FTP และ gopher เอาไว้บนสุด เพื่อกันไม่ให้มาใช้กฎด้านล่าง

ในบทความต้นตอ ยังมีเกร็ดการควบคุมแคชสำหรับเว็บที่เนื้อหาเป็น dynamic บางเว็บที่อาจทำแคชบางส่วนได้ รวมทั้งจัดการกับ windowsupdate ที่มักจะมากินแบนด์วิดท์บ่อย ๆ ด้วย

ที่มา: Speed up your Internet access using Squid's refresh patterns, comment ใน squid.conf

Comments

ผมอ่านในเวบนอกยังไงก็ไม่เข้าใจ เจอบทความนี้เข้าอ๋อเลย ต้องขอบคุณมากๆครับ เป็นประโยชน์ต่อชาวไทยที่สุด

Creative Commons License ลิขสิทธิ์ของบทความเป็นของเจ้าของบทความแต่ละชิ้น
ผลงานนี้ ใช้สัญญาอนุญาตของครีเอทีฟคอมมอนส์แบบ แสดงที่มา-อนุญาตแบบเดียวกัน 3.0 ที่ยังไม่ได้ปรับแก้