Berapa connection database satu request WordPress sebenarnya buka?
Aku tanya soalan ni pada diri sendiri masa satu site mula bagi error “Error establishing a database connection” waktu trafik naik. Sebelum nak tambah max_connections atau naikkan saiz server, aku nak tahu angka sebenar — bukan tekaan.
Jadi aku jalankan eksperimen kecil. Ini hasilnya.
Apa yang menentukan bilangan connection
- Bilangan server. WordPress biasa duduk atas satu server. Tetapi dalam setup high-availability dengan load balancer, beberapa server tuju database yang sama serentak.
- Plugin. Plugin yang ditulis betul guna objek global
$wpdbyang WordPress sediakan, dan objek tu guna semula connection sedia ada. Plugin yang ditulis cincai boleh buka connection baharu berasingan, jadi satu request boleh pakai lebih dari satu connection. - Permintaan aktif. Connection hanya terbuka selagi request sedang diproses. Kalau tiada pelawat pada satu-satu masa, tiada connection aktif.
- Konfigurasi server. Jenis antara muka PHP, sama ada PHP-FPM atau
mod_php, menentukan macam mana connection diurus dan dikumpul.
Nota penting: plugin yang tak dioptimum ialah punca biasa connection melambung.
Eksperimen
Bahagian ni nak uji sama ada pemasangan WordPress lalai betul-betul pakai satu connection sahaja setiap request.
1/5: Macam mana nak pantau connection aktif
Kau boleh guna alat database macam MySQL Workbench, tetapi skrip PHP kecil pun cukup — ia tanya jadual information_schema.processlist dan kumpulkan proses aktif ikut user, supaya kita boleh asingkan connection yang dibuat oleh user aplikasi WordPress.
<?php
$servername = "mysql";
$username = "root";
$password = "password";
$conn = new mysqli($servername, $username, $password);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT user, COUNT(*) as connections
FROM information_schema.processlist
GROUP BY user";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
if ($row['user'] == 'site_11703') {
echo "User: " . $row['user'] . " - Connections: " . $row['connections'] . "<br>";
}
}
}

Pastikan user database tu ada kebenaran untuk baca jadual information_schema.
2/5: Paksa request berjalan lama
WordPress bersih memuat terlalu laju, jadi connection aktif susah nak ditangkap dalam alat pemantau. Untuk buat ia nampak, aku sengaja lambatkan eksekusi: tambah sleep(10) di hujung wp-settings.php, jadi WordPress tahan connection tu terbuka sepuluh saat sebelum request tamat.

sleep(10) di hujung wp-settings.php, untuk tujuan ujian sahaja.3/5: Satu request ke site WordPress
Sekarang hantar satu request dan tengok kiraan connection.
Keputusan: satu request WordPress pakai tepat 1 connection database.
4/5: Lima request serentak
Untuk uji serentak, buka lima tab browser tak cukup — HTTP/2 multiplexing boleh gabungkan mereka jadi satu connection. Jadi aku guna k6 untuk tembak lima request serentak.
Keputusan: lima request serentak = lima connection aktif.
5/5: Sampai had — sepuluh request
Di sinilah bottleneck sebenar server tu muncul, dan ia bukan database. Ia had kolam worker PHP-FPM.
Environment ujian aku set pm.max_children = 5. Sebab hanya ada lima proses worker PHP, server hanya boleh proses lima request WordPress serentak. Tembak sepuluh pun, kiraan connection database kekal 5 — bakinya beratur di web server.

pm.max_children pada 5.Jadi: bilangan connection database dihadkan oleh bilangan worker PHP yang aktif.
Kesimpulan
Secara lalai, WordPress buka tepat satu connection database sepanjang eksekusinya. Bila request tamat, connection ditutup dan dipulangkan ke kolam.
Bila kau nak scale, ingat dua-dua arah menaikkan jumlah connection serentak: vertical scaling (tambah worker PHP) dan horizontal scaling (tambah server). Pastikan max_connections database kau cukup tinggi untuk menampung jumlah worker PHP maksimum yang mungkin, kalau tak mahu servis terhenti.
Dan kalau kau tengok connection naik lebih dari bilangan worker, jangan terus salahkan database. Cari plugin yang buka connection sendiri.

Leave a Reply
You must be logged in to post a comment.