wordpress admin slow เว็บช้ามากๆ

เรื่องนี้ผมใช้เวลาแก้อยู่นานพอตัว สิ่งที่เว็บ 90% ส่วนใหญ่แนะนำก็คือ
1.) คาดว่าเป็นที่ plugin ให้ไปลองไล่ disable ดูทีละตัว ว่าหายไหม
2.) ลองติดตั้ง wp cache ปลั๊กอินดู มีหลายตัวให้เลือกใช้ ว่าหายไหม แต่จังหวะไม่ hit cache ก็ช้าอยู่ดีหรือป่าว
3.) ลอง optimize ทุกอย่างตามหลัก PWA ดู ทั้ง image optimize, leverage caching, js blocking ต่างๆ
4.) เกี่ยวกับการใช้ theme ที่ดาวโหลดฟรีมาหรือไม่
5.) ลองโหลด query minitor ปลั๊กอิน มาใช้ดู และดูรายงานว่า query ตรงไหนช้า
6.) เปิด mysql slow log รายงาน query ที่ช้าดู ว่ามีอะไรแปลกๆไหม
7.) ลองปิดการทำงาน wp cron ดู
8.) มีใคร bruce force เว็บเราหรือไม่ ลองไปตรวจสอบ access_log และ error_log ซึ่งปกติ แต่หากมี เราสามารถป้องกันด้วยวิธี wordpress ป้องกัน brute force ได้
9.) มีปลั๊กอินบางตัว แอบเขียนไฟล์ระบบใน wordpress ของเราให้ curl หรือ header redirect ส่งคะแนน SEO ออกไปให้เว็บ hacker หรือไม่ ลองตรวจสอบ modified date ของไฟล์ต่างๆดู หรือสังเกต file size ของไฟล์หลักๆดู ให้เข้าไปลบทิ้ง
10.) ปิด admin-ajax.php พวกคอยแสดงกระดิ่ง หรือตัวเลขแจ้งเตือน user คนไหนทำอะไรอยู่ไป เพราะไม่ค่อยจำเป็น มันจะคอย ajax ถล่มเซิฟตัวเองทุกๆ 15 วินาทีโดย default

ผมได้ลองดูทั้งหมดแล้ว ปรากฏว่า ไม่ใช่ root cause หากใครยังไม่ได้ เรามีคำตอบ เกิดจาก pending cron ที่ไปค้างอยู่ในระบบ ก่อนที่เราจะทำข้อ 7. อาจจะมี pending cron อยู่จำนวนมหาศาล พอดีผมมี wordpress อยู่หลายเว็บ ที่มันก็โหลดเร็วปกติ

วิธีตรวจสอบ ให้เข้า phpmyadmin ไป query ข้อมูล cron ดูดังนี้

SELECT 'autoloaded data in KiB' as name, ROUND(SUM(LENGTH(option_value))/ 1024) as value FROM wp_options WHERE autoload='yes'
UNION
SELECT 'autoloaded data count', count(*) FROM wp_options WHERE autoload='yes'
UNION
(SELECT option_name, length(option_value) FROM wp_options WHERE autoload='yes' ORDER BY length(option_value) DESC LIMIT 10)

หากพบอะไรที่ค่าเกิน 100,000 KiB แสดงว่า ทุก page request มันจะต้องมาโหลดข้อมูลจำนวนนี้ จะทำให้ CPU,disk ขึ้น ซึ่งของผมมันเป็นที่ option_name = ‘cron’

ให้ export wp_options.sql ทำ backup ออกมาดู สังเกตว่า ไฟล์มันจะใหญ่ผิดปกติมากๆ

หลังจากนั้น ให้เราล้าง pending cron ด้วยคำสั่ง

UPDATE wp_options SET option_value = '' WHERE option_name = 'cron';

เว็บก็จะกลับมาโคตรเร็วปกติครับ

Related posts:

This entry was posted in wordpress. Bookmark the permalink.