Page File คืออะไร? เราควรปิดหรือเปิดมันดี? ควรใช้ RAM Disk เก็บไหม?

Page File คืออะไร

Page File (บางคนเรียก Swap file คล้ายๆกัน) คือไฟล์ที่ระบบ OS ต่างๆ เช่น Windows สร้างขึ้นมาเพื่อย้ายข้อมูลบางส่วนใน RAM มาเก็บใน Hard Disk ถ้าหากถามว่ามันทำเพื่ออะไร Hard Disk มันช้ากว่า RAM ไม่ใช่เหรอ คำตอบง่ายๆ เพื่อไว้ใช้ในกรณีที่มีโปรแกรมใช้ RAM มากๆ จนทำให้ RAM ไม่พอ จึงต้องย้ายบางโปรแกรมที่ไม่ใช้ไปเก็บที่อื่นก่อน เพื่อให้ RAM พอกับโปรแกรมที่เราใช้ในปัจจุบัน (ในบางครั้ง มันก็ย้ายลง Page file ทั้งที่ RAM ยังเหลืออยู่ เพราะว่ามันเก็บ Cache การอ่านไฟล์ลง RAM ด้วย ยกตัวอย่างเช่น การเปิด Word ครั้งแรกคุณจะรู้สึกว่าช้า แต่เมื่อคุณเปิดอีกครั้งมันจะเร็วขึ้น เพราะข้อมูลบางส่วนถูก Cache อยู่ใน RAM)

แล้วทำไมบางคนบอกให้ไปปิดมัน

อย่างที่ทราบกันว่า Hard Disk นั้นช้ากว่า RAM มาก เมื่อมีการย้ายข้อมูลบางส่วนลง Hard Disk ไปใส่ Page file แล้ว เมื่อมีการเรียกใช้ข้อมูลส่วนนั้น มันก็จะต้องวิ่งผ่าน Hard Disk ซึ่งช้ากว่า ทำให้มันช้าลงในกรณีนี้

แล้วจริงๆแล้วเราควรปิดมันไหม

อันนี้ไม่มีคำตอบตายตัว ต้องพิจารณาหลายอย่าง เช่น RAM ที่เครื่องมี โปรแกรมที่ใช้ โปรแกรมที่ถูกโหลดตอนเครื่องเปิด เป็นต้น

ยกตัวอย่างเช่น เครื่องผมมี RAM 16 GB และไม่ได้ใช้โปรแกรมที่กิน RAM สูงอย่างพวก Photoshop โดยทั่วไปผมใช้แค่ Word, PowerPoint,Chrome,Firefox ทั่วๆไป มีการเขียนโปรแกรมใช้พวก Eclipse, phpStorm ซึ่งกิน RAM ค่อนข้างมาก แต่ไม่เกิน 4GB ดังนั้นโดยทั่วๆไปเครื่องผมไม่น่าจะใช้ RAM ถึง 8 GB ได้ ดังนั้นในกรณีผมควรจะปิด เพื่อให้ใช้เครื่องได้ลื่นไหลขึ้น  (ไม่มีการเก็บข้อมูลใน Hard Disk แน่นอน เลยไม่มีการหน่วงเวลาสลับโปรแกรม)

อันนี้ก็ขึ้นกับ RAM ของคุณและพฤติกรรมของคุณ ถ้าคุณใช้แค่ Chrome, Firefox,Word ทั่วไป และมี RAM มากกว่า 8GB ผมแนะนำว่าควรปิดไปเลยก็ได้

คำเตือน หากคุณมีการใช้ Photoshop ตัอต่อ VDO หรืออะไรก็ตามที่ใช้ RAM เยอะ ไม่ควรปิดโดยเด็ดขาด เพราะหาก RAM ไม่พอ ถ้าโชคดีมันเตือนทัน มันก็จะเตือนให้ไปปิดโปรแกรมอื่น หรือเปิด Page file ก่อน แต่ถ้าเราแก้ไขไม่ทัน ตัว OS จะปิดโปรแกรมนั้นทิ้งทันที ซึ่งอาจจะทำให้ข้อมูลคุณหายได้

วิธีปิด Page file

หลังจากที่คุณตัดสินใจจะปิด Page file แล้ว การปิด Page file มีขั้นตอนดังนี้

  1. กดปุ่มรูป Windows + R แล้วพิมพ์ SystemPropertiesAdvanced ลงไป กด OK
    เปิด Run Command และใส่ SystemPropertiesAdvanced ลงไป กด OK
  2. กดที่ Settings
    กดที่ Settings
  3. ไปที่ Advanced และกด Change
    ไปที่ Advanced และกด Change
  4. เอาเครื่องหมายถูกบนสุดออก เพื่อบอกว่าเราจะตั้งค่า Page File เอง และเลือก No Paging File และกด Set เพื่อปิด Page file มันจะขึ้นข้อความถามว่า จะปิด Page file จริงๆใช่ไหม ให้กด Yes เลย
    เอาเครื่องหมายถูกบนสุดออกและเลือก No Paging File
  5. กด OK เรื่อยๆจนหมดครับ มันจะบอกว่าให้ Restart เครื่องไหม ให้กด Restart Now เพื่อ Restart ครับ เพื่อให้เครื่องปรับการตั้งค่า (ไม่สามารถลัดด้วยการ kill explorer.exe เปิดใหม่ได้นะครับ)

หากต้องการใช้ Page file ควรคิดถึงอะไรบ้าง

หากยังต้องการเปิด Page file อยู่ ไม่ว่าด้วยเหตุผล RAM ไม่เยอะ หรือป้องกันโปรแกรมปิดเองเวลา RAM ไม่พอ ผมมีข้อแนะนำนิดหน่อย ดังนี้

  1. เราควรเลือกให้อยู่ใน Partition ที่อยู่ Hard Disk คนละตัวกับที่มี Windows ถามว่าทำไม เพราะโปรแกรมโดยมากใช้ข้อมูลบน โฟลเดอร์ Windows และ Program files ในนั้น ดังนั้นหากเราย้ายไปที่ Hard Disk คนละตัว จะช่วยให้สามารถอ่านเขียนได้เร็วขึ้น เพราะไม่ต้องแย่งทรัพยากรกับโปรแกรมอื่น
  2. หากมี Hard Disk แค่ตัวเดียว ควรเลือก Partition ที่มีที่ว่างเหลือเยอะที่สุด เพื่อที่จะทำให้ Page file จะอยู่ติดกัน ไม่มี fragment บน Hard Disk มากนัก จะช่วยให้เร็วขึ้นนิดหน่อย
  3. ไม่ควรใส่ Page file ลงบน SSD เพราะ ถึงแม้ SSD จะเร็วมาก แต่มีการจำกัดจำนวนครั้งที่จะเขียนได้ต่อลูก ดังนั้นจึงทำให้อายุของ SSD สั้นลงได้ จนถึงขั้นว่าบางคนแนะนำให้ปิด Page file ถ้ามี SSD แค่ลูกเดียว

เราควรใช้โปรแกรมพวก RAM Disk ช่วยไหม

ผมไปอ่านมาหลายที่ มีหลายคนชอบแนะนำว่าให้ใช้โปรแกรม RAM Disk ช่วย คำถาม RAM Disk คืออะไร มันเป็นโปรแกรมที่นำพื้นที่บางส่วนของ RAM มาใช้เก็บข้อมูล และเนื่องจาก RAM มันเร็วมาก บางคนเลยเอามาใส่ Page File ซะเลย ซึ่งเป็นเรื่องที่ผิดครับ

ถามว่าทำไม? ลองกลับไปอ่านต้นๆของบทความนะครับ Page file คือ file ที่เก็บบางส่วนของ RAM ไปไว้บนไฟล์ เพื่อช่วยให้ระบบทำงานลื่นไหล แม้ว่าโปรแกรมจะกิน RAM มหาศาลก็ตาม

ทีนี้เมื่อเราใช้ RAM Disk ซึ่งเอาบางส่วนของ RAM มาทำเป็น Partition ดังนั้นหมายความว่า RAM Disk ไม่มีทางสร้างได้มากกว่าขนาดของ RAM ที่เรามี ดังนั้นจึงหมายความว่า Page file จะไร้ค่าไปในทันที เพราะโดยรวมแล้วจะไม่สามารถย้ายข้อมูลที่ไม่ใช้ออกนอก RAM ได้เลย เพราะงั้นถ้าจะใส่ Page file ลง RAM Disk ปิด Page file ไปเลยก็ได้ครับ

 

 

WordPress ช้าเพราะ Really Simple CAPTCHA

อันนี้เอามาจากโพสนี้ ไม่ได้เจอเอง คิดว่าน่าจะแก้ได้แล้วเพราะเจ้าของโพสมากดไลค์ แต่ไม่แจ้งผล

really_simple_captcha_property

ปัญหาที่เกิดคือเค้าบอกว่าเว็บช้ามาก เพราะ Really Simple CAPTCHA และขนาดของ plugin ใหญ่มาก (พวก cache ภาพที่ gen แล้วต่างๆ) ตอนแรกผมไม่เชื่อเท่าไหร่ เพราะผมคิดว่ามันไม่น่าจะช้าได้จากตัวนี้ จนกระทั่ง เค้าใช้ P3 Profiler มาให้ดูจริงๆ ผมก็เลยไปลองไล่ดู Code

ผมเดาว่าสาเหตุนั้นมาจากตอน clean up พวกภาพที่หมดอายุต่างๆ ทำให้มันกิน resource จากตัวอย่างคือ loop อ่าน meta file 20000 กว่ารอบ เพื่อลบไฟล์ที่ไม่ใช้ (ยิ่งถ้าใช้พวก NFS นะ โคตรช้า)

Solution

  1. เปิดไฟล์ really-simple-captcha.php หา function cleanup ให้แก้ไขเป็นดังนี้

    (ปิดการทำงานของ clean up เพื่อไม่ให้เว็บช้า เราจะย้ายไปทำใน background แทน)
  2. ให้สร้างไฟล์ชื่อ cleanup.php ข้างๆ really-simple-captcha.php มีเนื้อความดังนี้

    (เป็นไฟล์สำหรับ clean up แบบ manual)
  3. สร้าง cronjob เพื่อสั่งให้ cleanup.php ทำงาน (หรือเข้ามาสั่งเองทุกวันก็ได้ แต่ถ้าสั่งช้า มันจะกินพื้นที่ HDD เยอะขึ้นเรื่อยๆ)

จบ เอาไปทดสอบได้เลยครับ

ติดตั้ง/ปรับแต่ง DirectAdmin เพื่อให้รองรับจำนวนคนจำนวนมาก

อันนี้เป็นประสบการณ์กากๆของผมที่ทำต้องจัดการให้เซิฟเวอร์ที่ใช้ DirectAdmin อยู่ สามารถรองรับจำนวนคนได้เยอะๆครับ วิธีการง่ายๆดังนี้ครับ

  1. ปรับ Web Server ให้ใช้ Nginx เป็น Reverse Proxy (อ้างอิงวิธีการจาก ลิงค์นี้)
    1. ก่อนอื่นสำหรับ คนที่ติดตั้ง DirectAdmin ไปแล้วต้องมั่นใจว่า CustomBuild ต้องมากกว่าเวอร์ชั่น 2 สามารถตรวจสอบได้โดย SSH เข้าไป แล้วใช้คำสั่งดังนี้

      ดูว่าเลขหน้าสุดเป็นเลข 2 ไหมครับ ถ้าไม่ ให้ทำการปรับ CustomBuild เป็นเวอร์ชั่น 2 ครับ โดยสามารถทำได้ตามลิงค์นี้ครับ หรือสั่งคำสั่งด้านล่างนี้ครับ (คำเตือน Backup ทุกอย่างก่อน Update ทุกครั้ง)
    2. ติดตั้ง Nginx เป็น Reversed Proxy ซึ่งตรงนี้ทาง DirectAdmin เริ่ม Support การติดตั้งอัตโนมัติแล้ว สามารถทำได้ตามคำสั่งด้านล่างนี้ครับ
    3. เมื่อติดตั้งเสร็จแล้ว มันยังมีปัญหานิดหน่อยครับ คือตัว Apache ทีให้บริการ Web App นั้นมอง IP ของเซิฟเวอร์เองเป็น Client เนื่องจากวิ่งผ่าน Nginx จึงต้องลง mod เพิ่ม ดังนี้ครับ

      จากนั้นไปที่ /etc/httpd/conf/extra/httpd-includes.conf  แล้วเพิ่มข้อความต่อไปนี้ลงล่างสุดครับ
  2. ปรับแต่งเซิฟเวอร์เพื่อให้รองรับคนจำนวนมากได้ (จำเป็นค่อนข้างมาก ไม่งั้นอาจจะเจอ Bad Gateway หรือ Gateway Timeout บ่อย)
    1. ปรับแต่ง Kernel Queue เพื่อให้รับการเชื่อมต่อจำนวนมากๆได้ โดยใช้คำสั่งต่อไปนี้

      และเพิ่มบรรทัดต่อไปนี้ลงในไฟล์ /etc/sysctl.conf
    2. ปรับแต่ง Port ที่ระบบใช้ได้ให้มากกว่าเดิม โดยใช้คำสั่งต่อไปนี้

      และเพิ่มบรรทัดต่อไปนี้ลงในไฟล์ /etc/sysctl.conf
    3. ปรับแต่งให้ปิดการเชื่อมต่อได้เร็วขึ้น เพื่อเอาไปใช้รับการเชื่อมต่อใหม่ โดยใช้คำสั่งต่อไปนี้

      และเพิ่มบรรทัดต่อไปนี้ลงในไฟล์ /etc/sysctl.conf
    4. อันนี้ผมจำไม่ได้ว่ามันทำอะไรครับ แต่เห็นเซิฟเวอร์ปัจจุบันมี และคิดว่าค่อนข้างสำคัญ

      และเพิ่มบรรทัดต่อไปนี้ลงในไฟล์ /etc/sysctl.conf
    5. ปรับแต่งเพิ่มจำนวนไฟล์สูงสุดที่ 1 โปรเซสเปิดได้ให้มากที่สุด โดยใช้คำสั่งต่อไปนี้

      และเพิ่มบรรทัดต่อไปนี้ลงในไฟล์ /etc/security/limits.conf
  3. ปรับแต่งให้ Nginx ให้บริการ Static File (ไฟล์ที่ไม่ประมวลผลเช่นภาพเป็นต้น) โดยไม่ผ่าน Apache เพราะ Nginx สามารถทำงานด้านนี้ได้ดีกว่า Apache มาก (คำเตือน วิธีนี้จะทำให้ส่วนที่ถูกซ่อนไว้ โดย Password Protected Directories ของ DirectAdmin อาจจะทำให้ข้อมูลที่ถูกซ่อนบางส่วนหลุดไปได้โดยไม่ถามรหัสผ่าน แต่ผมว่าในเคสทั่วไปไม่ค่อยมีคนใช้) โดยสั่งคำสั่งดังต่อไปนี้

    เพียงเท่านี้ Nginx ก็จะให้บริการ Static File ส่วนมากให้ทันที (ผมอาจจะ list ไม่หมดเพราะผมก็ไปคัดลอกจากที่อื่นมาครับ)

เพียงเท่านี้ก็คิดว่าเซิฟเวอร์ปัจจุบันของท่านก็น่าจะรับโหลดเพิ่มขึ้นได้อีกเยอะครับ หากยังไม่สามารถรองรับได้อีก อาจจะต้องปรับ nginx ให้ cache หน้าที่ประมวลผลไว้สักหน้าละ 10 – 60 วิ แล้วแต่กรณีไป แต่พอดีที่ๆผมทำงาน Implement ระบบ Cache ด้านในไว้ เลยไม่มีปัญหามากครับ

วิธีการสุ่มค่าจาก SQL ที่ดีกว่าการใช้ ORDER BY RAND()

โดยทั่วไปเท่าที่ผมเห็น การจะสั่ง sql ให้ดึงแถวที่ต้องการมาโดยเรียงลำดับแบบสุ่มจะใช้วิธี ORDER BY RAND() เช่น

แต่วิธีนี้ไม่ใช่วิธีที่ดีเลย เพราะสมมุตว่าข้อมูลมีจะนวน 100000 แถว จะต้องเกิดการ random ค่าทั้งหมด 100000 ครั้ง นอกจากนั้นเมื่อ random เสร็จ ก็ต้องเอาข้อมูลนั้นมาเรียงลำดับใหม่อีกครั้ง ซึ่งในขั้นตอนการเรียง โดยมากแล้ว ตัว Database จะไม่ยอมให้ใช้เนื้อที่เกินจำนวนหนึ่งใน RAM แต่ถ้าข้อมูลเยอะๆแบบนี้ จะใช้การเขียนลง file ก่อน แล้วค่อย sort ซึ่งทำให้ช้ากว่าใน RAM มาก

ดังนั้นผมจึงหาวิธีสุ่มค่าที่มีประสิทธิ์ภาพที่ดีกว่าในเน็ต ซึ่งได้ผลลัพธ์คือเว็บนี้ เค้าแนะนำให้ทำแบบนี้แทนครับ

โดย table หมายถึงชื่อตาราง และตรง @lim := 10 หมายถึงต้องการ 10 ตัว ส่วนตัวเลข 20090301 เค้าบอกเป็นเลขอะไรก็ได้ เค้าเอาเลขนี้มาจากวันที่โพส และควรเปลี่ยนทุกครั้ง เพื่อให้ผลไม่เหมือนเดิม

หลักการทำงานคือเหมือนเค้าใช้หลักความน่าจะเป็นแทนการสุ่มมั้งครับ

จริงๆในเว็บต้นฉบับ เค้าบอกมีวิธีสำหรับแถวเดียวอยู่ด้วย แต่ผมไม่สามารถทำความเข้าใจได้ครับ