#Performance

เร่งคลิปจอเป็นช่วง ๆ แต่ให้นาฬิกาบนภาพเดินตามเวลาต้นฉบับ
วิธีทำไทม์แลปส์จากคลิปอัดหน้าจอที่เร่งช่วงนิ่งแรงกว่าช่วงทำงาน ด้วย split กับ trim กับ setpts แล้ว concat กลับ พร้อมกับดักใหญ่คือ drawtext ต้องวางก่อน setpts นาฬิกาถึงจะเดินตามเวลาต้นฉบับ ไม่ใช่เวลาที่ถูกเร่งไปแล้ว

รูปไม่โหลดในหน้าที่ซ่อนด้วย display:none เฉพาะบนมือถือ
หน้าเว็บแบบสลับหน้าด้วย display:none พอกดเปิดหน้าใหม่บนมือถือแล้วรูปดำเปล่า ทั้งที่ไฟล์คืน 200 และ fetch กับ new Image สำเร็จทั้งคู่ ตัวจริงคือ IntersectionObserver ของ loading=lazy ที่ไม่ยิงตอนหน้าเปลี่ยนจาก none เป็น block และการตั้ง loading=eager เฉย ๆ ก็ยังไม่พอ

time-series เป็น JSON โตวันละ 50 MB ย้ายลงคอลัมน์โดยไม่แก้ dashboard
เก็บค่าที่อ่านจากอุปกรณ์ทั้งเฟรมเป็น JSON array วินาทีละแถว ผ่านไปสองสัปดาห์ตารางโต 183 MB ที่ปลายทางและ 625 MB บนเซิร์ฟเวอร์ พร้อมกับ JSON_EXTRACT ที่ทำ index ไม่ได้ — วิธีย้ายไปเก็บเป็นคอลัมน์ int แล้วให้ API ประกอบ array คืนแบบ sparse เพื่อไม่ให้ dashboard รู้ตัวสักบรรทัด

ย้ายการคำนวณจาก PHP ไปทำในเบราว์เซอร์: 12 วินาที เหลือ 12 มิลลิวินาที
หน้าเดียวยิง subquery หลักหมื่นครั้งจนโหลดนาน 12 วินาที ผมแก้ด้วยการทำตารางสรุปไว้ล่วงหน้า ส่ง dataset ก้อนเดียว 107 KB แล้วย้ายสูตรไปคำนวณในเบราว์เซอร์ เหลือ 12 มิลลิวินาที พร้อม parity test ที่บังคับให้ผลฝั่ง JS ตรงกับ PHP ทุกแถว

คิวงาน Laravel บน shared host — อย่าเอาคิวไว้ Redis ตัวเดียวกับ cache
จะเปิด queue ให้ Laravel บน shared host แล้วคิดจะแยก REDIS_DB ให้คิวอยู่คนละเบอร์กับ cache — ไม่ช่วยครับ เพราะ maxmemory กับ eviction เป็นของทั้ง instance ไม่ใช่ของราย DB บทความนี้เล่าเหตุผลที่ผมเลือก database driver แทน พร้อม systemd unit เต็ม ๆ ที่ใช้แทน Supervisor

MariaDB ที่ยังใช้ค่า default — buffer pool 128M บนเครื่อง RAM 55 GB
เครื่อง 16 core RAM 55 GB SSD แต่ MariaDB ยังใช้ buffer pool 128 MB ตามค่าติดตั้ง ผลคืออ่านดิสก์ไป 50 ล้านครั้งใน 5 วัน ค่าก่อนหลังทั้งชุด กับดักชื่อ service กับ path config บน DirectAdmin/Debian วิธี rollback และ MyISAM อีก 500 ตารางที่รอแปลง

AI crawler ยิง ?add-to-cart= จนโหลดพุ่ง — บล็อกยังไงไม่ให้เสีย SEO
โหลดเซิร์ฟเวอร์พุ่งจนได้เมลเตือน ไล่ log แล้วพบว่า 84% ของทราฟฟิกทั้งวันมาจาก AI crawler ตัวเดียวที่ไล่กดลิงก์ add-to-cart ทุกสินค้า ปิดเป็นชั้น ๆ ด้วย robots.txt, rel=nofollow และ nginx limit_req โดยหน้าสินค้ายังถูก index ครบ

นำเข้าไฟล์ .xls จากระบบเก่าหลายร้อยไฟล์ลง Laravel ด้วย PhpSpreadsheet
ไฟล์ .xls จากระบบเก่าที่หัวตารางภาษาไทยเป็น tis-620 อ่านชื่อคอลัมน์ไม่ได้ ไฟล์ใหญ่ทำ PhpSpreadsheet กิน memory จนล้ม และไฟล์ที่ผู้ใช้รวมเองก็มีแถวซ้ำในตัวเอง — เลิกอ่านชื่อคอลัมน์แล้วนับตำแหน่งแทน ใส่ read filter และกันซ้ำด้วย natural key

charset ไม่ตรง ทำ index ตายเงียบ ตอน JOIN ข้ามฐาน — mirror utf8mb4
ฐานเก่าเป็น tis620 ฐานใหม่เป็น utf8mb4 พอ JOIN ข้าม database ปุ๊บ index ทุกตัวกลายเป็นของประดับทันทีโดยไม่มี error สักบรรทัด — วิธีพิสูจน์ด้วย EXPLAIN และวิธีทำ mirror แปลง tis620 เป็น utf8mb4 ตอน dump พร้อมกับดัก sed ที่ทำตารางพังเงียบ ๆ

query เดียวค้าง 54 นาที ทำเว็บล่ม 504 ทั้งเว็บ เพราะ MyISAM lock
ตารางเดียวขนาด 30 MB ทำให้เว็บทั้งระบบขึ้น 504 ทุกหน้า ทั้งที่ RAM ยังว่าง 9.5 GB — ไล่จาก information_schema.PROCESSLIST จนเจอ SELECT ตัวเดียวที่ค้าง 54 นาทีบนตาราง MyISAM แล้วลามเป็น metadata lock ทั้งเซิร์ฟเวอร์ พร้อมวิธีแก้เฉพาะหน้าและวิธีกันไม่ให้เกิดซ้ำ