MySQL: inferensi sintetis | Mati wunderbare Welt von Isotopp

Database


Dua minggu lalu saya tertarik untuk men-debug artdb, hierarki Replikasi yang digunakan oleh instance Artifactory kami.

Artifactory membebani database. Ini dikelola dengan mengoptimalkan sejumlah kueri lambat menggunakan beberapa trik penutup indeks dan dengan peningkatan perangkat keras utama.

Dengan menggunakan landasan yang kami beli, kami menemukan dan memperbaiki sebagian masalah berikut:

  • tetap: Sejumlah kueri pelaporan yang sangat mahal menggunakan indeks overlay meningkat 16x menjadi 20x dari waktu berjalan 180 detik menjadi waktu berjalan 8 detik-12 detik.
  • tetap: Kami mengoptimalkan database dan ukuran data kami dengan menyelesaikan siklus hidup data untuk beberapa jenis repositori, menghapus gambar lama.
  • tetap: Upgrade perangkat keras mengurangi beban lebih jauh dan membuat kueri lebih cepat.
  • tetap: Penyelidikan lebih lanjut mengidentifikasi pekerjaan cron sinkronisasi yang memuat database pada interval 40m. Cron telah berhenti bekerja dan sekarang sedang dalam proses membangun kembali.
  • tetap: Kueri yang berjalan lama terdeteksi dalam kode sumber Artifactory, yang memungkinkan kami dan dukungan jFrog untuk mengidentifikasi bahwa a) cache internal Artifactory untuk kueri ini sedang dilewati dan b) itu terjadi ketika beberapa Dari opsi pemantauan JMX diaktifkan, semua host aplikasi yang mengklik tombol. Instance database pemantauan dinonaktifkan untuk sementara.
  • tetap: Untuk setiap unduhan gambar, Artifactory menulis pembaruan statistik, yang dapat menyebabkan pertikaian kunci pada gambar panas. Kami mengidentifikasi konfigurasi yang dapat mematikan ini, dan kemudian menemukan bahwa pembaruan ini dapat dikelompokkan di latar belakang.
  • Tidak diperbaiki: Artifactory sama sekali tidak memahami konsep Replika dan database, hanya dapat menskalakan database dan itu memiliki batas mutlak.

Beban kerja basis data untuk Artifactory sekarang jauh di bawah level kritis dan berada dalam bandwidth perangkat keras saat ini dan yang ditingkatkan untuk perkiraan pertumbuhan 4x. Di luar itu, akan sulit untuk menskalakan secara vertikal tanpa mengubah arsitektur Artifactory.

Artifactory adalah perangkat lunak pihak ketiga yang menyimpan objek biner di salah satu dari beberapa penyimpanan BLOB dan menyediakannya kepada orang-orang yang membutuhkan biner dengan cara apa pun.

Ada opsi penyimpanan BLOB yang berbeda untuk itu, kami menggunakan S3.

Ada beberapa opsi format pengiriman untuk Artifactory, kami menggunakan banyak di antaranya, dengan Docker Repository dan Maven Repository yang paling menonjol.

Artifactory menggunakan database sebagai penyimpanan metadata, dan sekali lagi, ada beberapa opsi yang memungkinkan. Kami menggunakan MySQL.

Format dan protokol pengiriman biner yang didukung oleh Artifactory (https://jfrog.com/artifactory/).

Keluhan awal adalah bahwa “Artifactory rusak” dan “database kelebihan beban”. Ulasannya menunjukkan bahwa ini sangat benar:

Hirarki iterasi utama adalah blade dari tahun 2017 dengan 12C/24T dan dimuat ke tahun 40-an.

Untuk MySQL jenuh CPU pada 12C/24T, apa pun di atas 18-20 mungkin tidak terlalu stabil dan tentu saja tidak menyenangkan.

Saya melihat beban hierarki iterasi penuh dan memperhatikan beberapa hal:

  • Artifactory tidak memahami konsep replikasi, beberapa pegangan basis data, atau skala di tingkat basis data. Itu hanya berbicara dengan database utama dan hanya dapat menskalakan secara vertikal.
  • Basis data Artifactory melihat beban kueri yang sangat besar (>20.000 QPS) yang terdiri dari sejumlah besar pembacaan dan penulisan sub-1000 per detik. Beberapa pembacaan adalah kueri yang berjalan lama, dengan waktu eksekusi di tahun 180-an.
  • Kueri yang berjalan lama telah dipercepat dari 180-an menjadi 9-an dengan menerapkan indeks sampul dan beberapa tipuan urutan daftar.

Untuk penulisan lengkap langkah ini, baca Boiling JFrogs.

Saat kami menyelesaikan startup yang lama, kami menemukan beberapa masalah lagi di tingkat basis data. Tapi pertama-tama kami melemparkan lebih banyak inti ke dalam api dan mengubah Artifactory secara vertikal untuk membeli lebih banyak bandwidth:

Varian perangkat keras Blade 7 menggunakan 2 CPU seharga $400 untuk 16C/32T. Perangkat keras Blade 2A.1 menggunakan 2 unit CPU $2100 untuk 32C/64T. Pada saat yang sama, prosesor yang lebih mahal ini juga berjalan sekitar 1 GHz lebih cepat.

Karena kami memiliki kueri pemindaian yang berjalan lama ini pada data penghuni memori, kami menggunakan banyak CPU. Bahkan setelah pengoptimalan, pemindaian ini dilakukan, tetapi pada data yang kurang terorganisir dan lebih baik dengan satu tingkat tipuan dihapus dari setiap akses data – jadi 16x hingga 20x lebih cepat.

Namun, kami memiliki beban dasar 12 pada Blade 7 dengan hanya 12C/24T. Pindah ke yang lebih lengkap, tetapi lebih mahal, Blade 2A.1 kami memiliki 32C/64T dan kami mendapatkan kecepatan clock sekitar 1GHz pada saat yang bersamaan.

Saat memuat 12 pada Dual-4110, kami memiliki 6 inti per soket yang berjalan pada 2400 MHz. Dengan beban 12 pada Dual-6130, kami memiliki 6 core yang jauh lebih sibuk, jadi kami menganggarkan untuk jam 3400 MHz, yang 1 GHz lebih cepat. Ini selesai lebih cepat, kami memiliki lebih sedikit konkurensi dan beban turun menjadi 8, 4 core per soket dan 3500MHz hingga semuanya stabil.

CPU modern tidak memiliki anggaran daya dan anggaran termal untuk menjalankan semua inti mereka dengan kecepatan penuh sepanjang waktu. Semakin tinggi beban, semakin sedikit waktu yang mereka butuhkan untuk meleleh atau kelaparan. Untungnya, sebagai toko online, kami tidak banyak melakukan FPU di luar bagian ML, jadi “Normal” adalah garis yang berlaku di sini.

Menjalankan beban kerja yang sama pada CPU kelas atas membuat persentase inti yang lebih rendah tetap sibuk, yang kemudian dapat dijalankan pada jam yang lebih tinggi. Beban kerja selesai lebih cepat dan tingkat konkurensi lebih rendah – Anda sebenarnya akan melihat lebih sedikit beban Linux di kotak.

Ini terjadi pada kami juga, kami meningkatkan kecepatan clock sedikit kurang dari 1/3 dan mendapatkan beban sekitar 1/3 lebih sedikit. Kotak pengganti yang menjalankan kueri yang dioptimalkan bersenandung bersama dengan pemuatan 5-10 hari, yang baik untuk perangkat kelas dan ukurannya:

Perangkat pengganti bagus untuk ~40 beban, tetapi berjalan pada 10 atau kurang, jadi kami baik-baik saja. Lebih banyak pengoptimalan setelah 10 September menunjukkan lebih banyak peningkatan, baca terus.

Ini menstabilkan hal-hal dengan cara yang memungkinkan pengujian lebih lanjut dan mengungkap masalah lain yang sebelumnya tidak terlihat dalam semua api dan asap.

Melihat berbagai indikator yang dilaporkan oleh monitor database, kami melihat pola berbeda yang menunjukkan interval waktu 40 menit. Sesuatu mendorong beban ke database dalam gelombang, tetapi kami tidak tahu apa: itu menggunakan pengguna produksi Artifactory normal, dan itu berasal dari satu (tetapi hanya satu) kotak aplikasi Artifactory.

Kami melihat pola akses yang berulang pada interval 40 menit dan meningkatkan berbagai statistik. Data mewakili satu baca dan tulis (baca berat) dari mesin aplikasi Artifactory.

Menemukan pelakunya membutuhkan banyak upaya bagi kami, karena berbagai hal lain mengganggu (termasuk Wayang mengaktifkan kembali dirinya sendiri dan membatalkan perubahan konfigurasi debug). Ternyata, itu adalah kita selama ini.

Khususnya: ada tugas cron yang membaca data dari direktori layanan dan dari Artifactory, membandingkan keduanya, lalu membuat izin akses dan pengaturan lain di database Artifactory untuk aplikasi. Ini memungkinkan Anda untuk mengakses artefak yang Anda andalkan berdasarkan apa yang dideklarasikan di SD.

Membatalkan tugas cron ini membawa kelegaan langsung dan lebih menenangkan beban, tetapi memperlambat perubahan yang datang dari SD ke Artifactory.

Pelajaran yang didapat:

  • Selalu gunakan pengguna yang berbeda untuk aplikasi yang berbeda (satu per aplikasi, per tugas cron, dll.). Bahkan jika ini memiliki hak yang sama dan mengakses tabel yang sama, menjadi lebih mudah untuk mengidentifikasi komponen perangkat lunak mana yang bertanggung jawab untuk hal yang sama.
  • Sementara Artifactory tidak memahami Replika dan hanya bekerja dengan database utama, komponen kami sendiri di sekitar ini tidak dibatasi oleh batasan itu. Skrip ini dapat membaca dari replika apa pun dan kemudian hanya menulis perubahan yang diperlukan.
  • Skrip ini tentu saja memberi banyak bobot pada apa yang dilakukannya dan membutuhkan cinta dan pembangunan kembali. Sekarang ada di tangan seseorang.

Kueri buruk yang kami optimalkan di bagian 1 masih ada dan melihat apa yang sebenarnya mereka lakukan, tampaknya tidak berguna.

Beberapa contoh kueri pelaporan yang dijalankan secara paralel. Tampaknya bahkan dioptimalkan tidak berguna. Kami ingin tahu dari mana mereka berasal.

Melihat kueri itu sendiri, kami melihat SQL ini:

SELECT SUM(bin_length) FROM nodes WHERE node_type=1 and repo = '<reponame>'

Ini adalah permintaan laporan yang menghitung ukuran kumulatif semua hal dalam repositori di Artifactory kami. Sekarang karena cepat, kita dapat melihatnya datang dalam interval 15 detik dari setiap instance aplikasi Artifactory kita.

Ini menunjukkan bahwa string kueri dihasilkan dari biner Artifactory yang sebenarnya.

Kami benar-benar dapat mengunduh kode sumber Java Artifactory dan memasukkannya ke IntelliJ dan kemudian mencarinya. Kami bahkan menemukan sesuatu, karena string kueri untungnya secara harfiah tertanam di kelas DAO dan tidak dibuat.

Untuk melakukan pencarian panjang dan beberapa percakapan dukungan singkat:

  • Kueri ini tidak bisa cepat, tetapi berkat penyembunyian indeks, kueri ini bisa lebih cepat dari perkiraan pertama.
  • Untuk alasan ini, ada cache di Artifactory untuk ini.
  • Jelas, seperti yang ditunjukkan oleh kemunculan berulang dari 15 detik kueri, cache tidak berfungsi.
  • Ternyata itu berfungsi untuk Artifactory, tetapi jika Anda mengaktifkan pemantauan JMX, JMX melewati cache dan memberi Anda nilai baru dengan biaya tinggi untuk setiap instance aplikasi Artifactory dari satu-satunya database yang kami miliki di Prometheus untuk diberikan Interval awal 15 detik
  • Menonaktifkan pemantauan untuk komponen ini menghapus sumber daya beban kerja ini.
  • Ini tidak didokumentasikan di Artifactory, dan juga tidak segera terlihat untuk dukungan mereka.

Kueri yang ditampilkan di atas hanyalah salah satu contoh dari banyak kueri dengan spesifikasi dan biaya yang serupa. Untuk memperkirakan efek dengan benar, kalikan efeknya dengan 3-4 lalu kalikan dengan jumlah instance aplikasi yang terhubung ke database.

Dari sudut pandang database, ini juga. Basis data saat ini tidak membatasi stabilitas atau skalabilitas, konfigurasi saat ini bahkan dapat dikurangi menjadi blade standar yang murah.



Source link

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan.