Cara Benchmark VPS dengan Betul dan Tepat
Ketahui cara melakukan benchmark VPS menggunakan YABS, fio, sysbench dan iperf3. Fahami mengapa satu ujian sahaja tidak mencukupi untuk menilai prestasi sebenar pelayan anda.
Maksud penanda aras VPS
Untuk melakukan penanda aras pada VPS, anda perlu mengukur empat perkara: kelajuan teras CPU tunggal, lebar jalur memori mesin, jumlah operasi cakera rawak kecil yang dapat diproses oleh storan setiap saat, dan jumlah throughput yang dihantar oleh pautan rangkaian. Satu larian yabs.sh memberikan kesemua empat ukuran ini dalam masa kira-kira sepuluh minit. Membaca keputusan adalah bahagian yang lebih sukar, kerana VPS (virtual private server) berkongsi perkakasan fizikal dengan penyewa lain, jadi mesin yang sama boleh memberikan angka yang berbeza pada jam 03:00 berbanding jam 20:00.
Rancangan di sini adalah untuk menjalankan yabs.sh bagi mendapatkan gambaran pantas, kemudian menjalankan alat di bawahnya secara manual. Menjalankan alat tersebut sendiri membolehkan anda menukar satu flag, melihat perubahan angka, dan memahami perkara sebenar yang diukur oleh angka tersebut. Lakukan ini selepas mesin disediakan, bukan sebelumnya. Langkah-langkah dalam sepuluh minit pertama pada VPS baharu perlu didahulukan, kerana pelayan yang masih dalam proses kemas kini pusingan pertama akan memberikan keputusan penanda aras yang buruk atas sebab yang tiada kaitan dengan perkakasan.
Periksa mesin sebelum anda mengukurnya
Separuh daripada setiap penanda aras (benchmark) yang buruk berpunca daripada mesin yang tidak difahami oleh penulisnya.
nproc
lscpu | grep -E 'Model name|Hypervisor|Thread'
free -h
df -hT /
uname -r
systemd-detect-virtHypervisor vendor: KVM bermaksud virtualisasi penuh, jadi anda menjalankan kernel anda sendiri. Mencetak lxc atau openvz melalui systemd-detect-virt bermaksud virtualisasi kontena: anda berkongsi kernel hos, dan had CPU serta memori anda adalah tetapan cgroup (control group) dan bukannya perkakasan maya. Pada sistem cgroup v2, anda boleh membaca had CPU secara terus.
cat /sys/fs/cgroup/cpu.maxmax 100000 bermaksud tiada kuota. 200000 100000 bermaksud anda boleh menggunakan 200000 mikrosaat CPU dalam setiap tempoh 100000 mikrosaat, iaitu kuota bersamaan dua teras. Pelan yang diiklankan sebagai 4 vCPU dengan kuota dua teras tidak akan mencatatkan skor seperti empat teras, dan tiada alat penanda aras yang mencetak baris untuk memberitahu anda sebabnya.
df -hT / penting atas sebab yang berbeza: lajur Type. Jika ia memaparkan overlay, anda berada di dalam kontena, dan ujian cakera di bawah memerlukan perubahan. Catatkan perkara ini sekarang.
Pantau steal time sepanjang masa
Steal time ialah bahagian masa CPU maya anda yang sedia untuk dijalankan, namun hypervisor memberikan teras fizikal tersebut kepada pihak lain. Ini merupakan isyarat tunggal paling berguna untuk menentukan sama ada keputusan yang diperoleh berpunca daripada jiran pelayan anda dan bukannya perkakasan anda sendiri.
vmstat 1 10Baca lajur st di sebelah kanan. Nilai 0 atau 1 yang stabil adalah normal. Nilai yang berterusan melebihi 5 bermakna hos sedang mengalami langganan berlebihan (oversubscribed) pada ketika itu, jadi setiap angka CPU yang anda rekodkan dalam tempoh tersebut adalah rendah tanpa sebarang kesalahan daripada mesin anda. top memaparkan angka yang sama seperti %st pada baris CPU. Pastikan vmstat 1 berjalan dalam sesi SSH kedua semasa anda melakukan penanda aras (benchmark), dan catatkan angka steal di sebelah setiap keputusan.
Bermula dengan yabs.sh
yabs.sh (Yet Another Bench Script) ialah skrip shell yang memuat turun binari statik fio, iperf3 dan Geekbench, menjalankannya, serta mencetak satu ringkasan. Ia merupakan bahasa umum dalam perbincangan penanda aras VPS, jadi output yabs adalah cara terpantas untuk membandingkan data dengan orang lain.
Bentuk satu baris projek tersebut adalah seperti berikut.
curl -sL yabs.sh | bashPerintah tersebut menyalurkan apa sahaja yang dihidangkan oleh URL tersebut terus ke dalam shell. Muat turunnya, baca kandungannya, kemudian jalankannya.
curl -sLo yabs.sh https://raw.githubusercontent.com/masonr/yet-another-bench-script/master/yabs.sh
less yabs.sh
bash yabs.shFlag diletakkan selepas -s -- apabila anda menyalurkan (pipe), atau terus selepas nama fail apabila anda menjalankan salinan tempatan. Flag yang berguna adalah: -f melangkau ujian cakera, -i melangkau ujian rangkaian, -g melangkau Geekbench, -r mengurangkan lokasi iperf3 kepada dua, -j mencetak keputusan sebagai JSON, dan -w results.json menulis JSON tersebut ke dalam fail.
bash yabs.sh -r -w yabs-run1.jsonDua perkara perlu diketahui sebelum larian pertama. Geekbench memuat naik keputusan anda dan mencetak URL public browser.geekbench.com, jadi sesiapa yang memegang pautan tersebut boleh membaca model CPU dan skor anda. -g melangkau ujian tersebut sepenuhnya. Kedua, peringkat iperf3 memindahkan trafik sebenar ke pelayan di beberapa wilayah, dan itu akan ditolak daripada kuota jalur lebar bulanan anda. Pada pautan 1 Gbit/s, peringkat rangkaian penuh boleh memindahkan berpuluh-puluh gigabait, jadi gunakan -r pada kuota kecil dan -i pada pautan bermeter.
Makna setiap bahagian output yabs
Bahagian disk menjalankan fio dengan campuran baca dan tulis 50/50 pada empat saiz blok: 4k, 64k, 512k dan 1m. Ia melaporkan IOPS (input/output operations per second) dan lebar jalur bagi setiap satu. Baris 4k ialah baris yang perlu diberi perhatian untuk pangkalan data, pelayan mel, atau sebarang aplikasi yang melakukan banyak penulisan kecil, kerana kebanyakan IO pelayan adalah kecil dan bertaburan. Baris 1m ialah baris untuk sandaran dan video, di mana anda memindahkan aliran bait yang panjang.
Bahagian network menjalankan iperf3 terhadap pelayan awam di beberapa wilayah, dalam kedua-dua arah, menggunakan aliran selari. Anggap nombor yang rendah di sini sebagai satu persoalan dan bukannya jawapan, kerana pelayan iperf3 awam dikongsi dan sering tepu, jadi keputusan yang lemah mungkin berpunca daripada pihak pelayan di hujung sana.
Bahagian Geekbench memberikan skor teras tunggal dan skor berbilang teras. Teras tunggal meramalkan seberapa pantas satu permintaan, satu kompilasi atau satu pertanyaan selesai. Berbilang teras kebanyakannya memberitahu anda berapa banyak teras yang anda benar-benar miliki.
Disk: jalankan fio sendiri
fio (flexible IO tester) ialah alat yang mendasari bahagian cakera yabs, dan menggunakannya secara terus adalah langkah di mana flag mula membawa makna.
sudo apt update && sudo apt install -y fio sysbench iperf3Ujian baca rawak 4k pada queue depth 32, pada sistem fail yang anda benar-benar perlukan:
fio --name=randread4k --filename=./fio-testfile --size=2G --bs=4k \
--rw=randread --ioengine=libaio --iodepth=32 --direct=1 \
--runtime=60 --time_based --group_reportingBaris ringkasan yang perlu dibaca daripada output kelihatan seperti ini.
read: IOPS=184k, BW=719MiB/s (754MB/s)(42.1GiB/60001msec)Di bawahnya, fio mencetak blok clat percentiles. Persentil ke-99.00 ialah angka yang wajar dipetik, kerana ia menunjukkan tempoh masa permintaan paling perlahan dalam setiap seratus permintaan terpaksa menunggu. Latensi purata menyembunyikan gangguan yang sebenarnya disedari oleh pengguna.
--direct=1membuka fail denganO_DIRECT, supaya bacaan memintas cache halaman kernel. Tanpanya, laluan kedua ke atas fail 2G pada mesin dengan 8G RAM akan dilayan daripada memori dan fio akan melaporkan IOPS dalam jutaan. Angka itu benar, tetapi ia adalah angka memori.--ioengine=libaiomenghantar permintaan tak segerak (asynchronous), yang membolehkan--iodepth=32mengekalkan 32 permintaan dalam proses serentak. Dengan enjin segerak sepertipsync, iodepth melebihi 1 tidak memberikan sebarang kesan, jadi anda hanya mengukur satu permintaan pada satu masa.--time_based --runtime=60berjalan untuk tempoh tetap 60 saat dan bukannya jumlah kerja yang tetap, supaya cakera yang pantas dan cakera yang perlahan mendapat tempoh masa yang sama dan perbandingan kekal adil.--size=2Gmenetapkan saiz fail ujian. Pastikan ia lebih besar daripada mana-mana cache dalam laluan tersebut, dan semak dahulu sama ada anda mempunyai ruang kosong yang mencukupi.
Tulis rawak menggunakan arahan yang sama dengan --rw=randwrite. Jalankannya secara berasingan, kemudian padam fail tersebut.
fio --name=randwrite4k --filename=./fio-testfile --size=2G --bs=4k \
--rw=randwrite --ioengine=libaio --iodepth=32 --direct=1 \
--runtime=60 --time_based --group_reporting
rm -f ./fio-testfileUntuk campuran yang lebih hampir dengan trafik sebenar, gunakan --rw=randrw --rwmixread=70. Kelas storan yang anda gunakan akan mengubah keputusan ini lebih daripada mana-mana flag, dan perbezaan tersebut dibincangkan dalam perbezaan antara storan NVMe dan SATA SSD pada VPS.
Apabila fio terhenti dengan Unknown error -1
Direct IO tidak tersedia pada setiap sistem fail. overlay, sistem fail yang diberikan oleh Docker kepada kontena secara lalai, dan beberapa sistem fail rangkaian tidak menyokong O_DIRECT, jadi libaio menghantar permintaan yang tidak dapat diselesaikan oleh kernel dan fio akan berhenti:
fio: io_u error on file ./fio-testfile: Unknown error -1: read offset=0, buflen=4096
fio: pid=1234, err=-1/file:ioengines.c:321, func=get_events, error=Unknown error -1Jalankan df -hT . terlebih dahulu. Jika lajur Type memaparkan overlay, halakan --filename ke laluan pada storan sebenar seperti bind mounted volume, atau jalankan fio pada hos dan bukannya di dalam kontena. Jika storan sebenar tidak dapat dicapai, larian segerak (synchronous) berpenimbal sekurang-kurangnya membuktikan bahawa arahan tersebut adalah betul.
fio --name=randread4k-buffered --filename=./fio-testfile --size=256M --bs=4k \
--rw=randread --ioengine=psync --direct=0 --numjobs=1 \
--runtime=15 --time_based --group_reporting
rm -f ./fio-testfileJujurlah mengenai jenis larian tersebut. Selepas pas pertama, fail 256M akan berada dalam page cache, jadi angka IOPS yang diperoleh menggambarkan prestasi RAM anda. Gunakannya untuk mengesahkan bahawa fio telah dipasang dan flag yang digunakan dapat dihuraikan. Jangan sekali-kali memetik angka tersebut sebagai hasil ujian cakera.
Mengapa dd bukan penanda aras cakera
dd sering muncul dalam banyak perbincangan VPS, dan ia menjawab satu soalan yang terhad.
dd if=/dev/zero of=./ddtest bs=1M count=1024 oflag=direct conv=fdatasync
rm -f ./ddtestPerintah itu mengukur daya pemprosesan tulis berjujukan dengan satu thread dan satu permintaan yang sedang diproses. Ia merupakan pemeriksaan kewarasan yang munasabah. Ia tidak memberikan maklumat tentang IO rawak, dan tidak menunjukkan apa yang berlaku apabila 32 permintaan tiba serentak. Abaikan oflag=direct dan ia kebanyakannya hanya mengukur seberapa cepat kernel anda menerima data tulis ke dalam memori, itulah sebabnya angka dd yang dipetik dalam catatan forum sering kali tidak masuk akal.
CPU: sysbench cpu
sysbench cpu --cpu-max-prime=20000 --threads=1 run
sysbench cpu --cpu-max-prime=20000 --threads=$(nproc) runAngka yang perlu diperhatikan ialah events per second. Jalankan ujian satu thread terlebih dahulu. Ini adalah angka yang menentukan kepantasan satu permintaan PHP selesai atau satu tugasan kompilasi tamat, dan ia paling banyak berbeza antara hos pada harga yang sama. Kemudian, jalankan dengan semua thread, yang menunjukkan sama ada vCPU anda merupakan teras (core) berasingan atau hanya bahagian daripada satu teras.
Fahami perkara yang diukur oleh ujian ini: sysbench cpu berulang kali mencari nombor perdana menggunakan aritmetik integer 64 bit. Ia tidak membebankan lebar jalur memori, unit vektor atau cache dengan cara yang menyerupai beban kerja sebenar. Oleh itu, ia sesuai untuk membuat perbandingan antara dua hos, tetapi kurang tepat untuk meramal prestasi aplikasi anda.
Ubuntu 24.04 membekalkan sysbench 1.0.20, di mana nama ujian diletakkan di hadapan. Jika anda menyalin arahan dengan --test=cpu daripada catatan lama, anda akan mendapat WARNING: the --test option is deprecated. Skor daripada sysbench 0.4 dan sysbench 1.0 tidak boleh dibandingkan sama sekali. Oleh itu, jangan sesekali membandingkan ukuran anda dengan angka yang diterbitkan tanpa menyatakan versi yang digunakan.
Memori: sysbench memory
sysbench memory --memory-block-size=1M --memory-total-size=20G --memory-oper=write --threads=1 run
sysbench memory --memory-block-size=1M --memory-total-size=20G --memory-oper=read --threads=1 runHasilnya adalah dalam MiB/saat, dan bacaan sentiasa lebih pantas daripada penulisan pada setiap mesin. Kekalkan --memory-block-size pada 1M, dan pastikan ia sama pada setiap hos yang anda bandingkan. Pada 1K, angka tersebut akan merosot kerana anda menanggung overhead setiap operasi seribu kali ganda lebih kerap, jadi anda akhirnya mengukur kos gelung dan bukannya lebar jalur memori. Ini adalah flag yang paling kerap tidak sepadan dalam skor memori yang diterbitkan.
Rangkaian: iperf3
Cara yang jujur untuk menguji throughput adalah dengan menggunakan mesin kedua yang anda kawal, kerana dengan cara itu anda mengetahui apa yang dilakukan oleh kedua-dua hujung sambungan.
Pada hujung jauh:
iperf3 -sPerintah itu mendengar pada TCP 5201. Buka port tersebut hanya untuk alamat yang anda gunakan untuk menguji, dan tutup port itu apabila anda selesai. Peraturan asas firewall ufw pada VPS merangkumi sintaks tersebut.
Daripada VPS yang sedang diuji:
iperf3 -c 203.0.113.10 -t 30
iperf3 -c 203.0.113.10 -t 30 -R
iperf3 -c 203.0.113.10 -t 30 -P 8Perintah pertama mengukur muat naik daripada mesin yang sedang diuji. -R menyongsangkan arah, yang mengukur muat turun. -P 8 membuka lapan aliran selari.
Jalankan aliran tunggal dan versi selari kedua-duanya, kerana ia menjawab soalan yang berbeza. Satu sambungan TCP hanya boleh menampung data yang tidak diakui sebanyak yang dibenarkan oleh tetingkapnya, jadi had maksimumnya adalah kira-kira saiz tetingkap dibahagikan dengan masa pergi-balik (round trip time). Pada latensi 80 ms dengan tetingkap 4 MB, had tersebut adalah kira-kira 400 Mbit/s, tidak kira betapa laju pautan di bawahnya. Angka aliran tunggal memberitahu anda kelajuan yang akan diperolehi oleh satu muat turun. Angka selari memberitahu anda kapasiti pautan tersebut.
Perhatikan peruntukan lebar jalur anda semasa melakukan ini. Tiga puluh saat pada 1 Gbit/s memindahkan kira-kira 3.75 GB, dan anda akan menjalankannya beberapa kali dalam setiap arah.
Angka rujukan, dan cara membaca angka anda
The data behind this chart
[
{
"device": "Local NVMe",
"iops_4k_read": "180,000"
},
{
"device": "Local SATA SSD",
"iops_4k_read": "90,000"
},
{
"device": "Network block",
"iops_4k_read": "12,000"
},
{
"device": "Spinning disk",
"iops_4k_read": "180"
}
]Volum NVMe tempatan dalam keputusan yang diterbitkan biasanya mencapai sekitar 180,000 IOPS bacaan rawak 4k. SSD SATA tempatan pula berada pada sekitar 90,000. Storan blok yang disambungkan melalui rangkaian, di mana setiap permintaan merentasi rangkaian sebelum sampai ke cakera, berada pada sekitar 12,000, manakala cakera berputar menguruskan kira-kira 180, kerana ia perlu menggerakkan kepala fizikal bagi setiap permintaan rawak.
Ini adalah angka tipikal yang diterbitkan untuk setiap kelas storan, bukan ukuran daripada satu hos sahaja. Gunakannya untuk satu tujuan: menyemak sama ada keputusan anda berada pada magnitud yang betul. Jika pelan yang dijual sebagai NVMe mencatatkan penanda aras dalam lingkungan beberapa ribu IOPS 4k, pastikan dahulu --direct=1 dihidupkan. Jika ia dihidupkan, maka storan tersebut tidak menepati deskripsi halaman produk, atau anda berkongsi storan tersebut dengan jiran yang sangat sibuk.
Mengapa satu larian bukan penanda aras
Satu keputusan hanyalah gambaran bagi satu minit pada mesin yang dikongsi. Anggap ia sebagai satu sampel sahaja.
- Jalankan setiap ujian sekurang-kurangnya lima kali, yang disebarkan merentasi jam yang berbeza dan sekurang-kurangnya dua hari yang berlainan. Simpan nilai median dan julatnya. Keputusan yang diterbitkan tanpa julat hanyalah angka pemasaran.
- Rekodkan steal time di samping setiap larian. Buang larian di mana
stadalah tinggi, atau sekurang-kurangnya catatkan perkara tersebut. - Jalankan ujian cakera pada dua tempoh masa. Banyak pelan memberikan peruntukan IOPS burst yang diisi semula dari semasa ke semasa, jadi larian fio selama 60 saat mengukur burst manakala
--runtime=600mengukur tahap minimum (floor). Tahap minimum ialah apa yang anda peroleh pada hari yang buruk. - Pastikan tiada proses lain yang sedang berjalan.
unattended-upgradesyang memulakan transaksi apt di tengah-tengah ujian CPU akan menjejaskan markah anda, danps -e -o comm= | grep -E 'apt|dpkg'sebelum setiap larian mengambil masa sesaat. - Ubah satu pemboleh ubah pada satu masa. Versi alat, saiz blok atau bilangan thread yang berbeza menghasilkan angka yang tidak boleh dibandingkan, tidak kira betapa serupa pun angka tersebut kelihatan.
Apabila anda membandingkan dua penyedia, jalankan ujian pada jam yang sama pada hari yang sama. Jika tidak, anda sebenarnya hanya mengukur waktu hari tersebut.
Uji penanda aras beban kerja anda sendiri pada peringkat akhir
Alat sintetik memberikan kedudukan kepada mesin. Hanya beban kerja anda sendiri yang menentukan sama ada sesebuah mesin itu mencukupi. Ukur masa bagi tugasan yang anda benar-benar lakukan.
time tar -czf /tmp/bench.tgz /usr/share
rm -f /tmp/bench.tgzPerintah tersebut memampatkan beberapa ratus megabait, jadi ia menguji CPU dan cakera secara serentak dan berubah apabila salah satu daripadanya berubah. Amaran Removing leading / from member names adalah perkara biasa. Lebih baik lagi, ukur masa binaan (build) anda sendiri, pertanyaan (query) paling perlahan anda, atau pemaparan halaman anda sendiri. Binaan yang mengambil masa 4 minit pada satu hos dan 7 minit pada hos lain telah menyelesaikan persoalan tersebut, tidak kira apa yang difikirkan oleh Geekbench. Ini juga merupakan ukuran yang memberitahu anda bila penambahan kuasa mesin tidak lagi berbaloi untuk dibayar, perkara yang perlu diketahui sebelum anda membaca kos sebenar VPS sebulan atau memindahkan beban kerja ke pelayan berdedikasi.
FAQ
Mengapa saya mendapat keputusan penanda aras yang berbeza setiap kali saya menjalankannya?
VPS berkongsi CPU fizikal, storan dan rangkaian dengan penyewa lain, jadi keputusan anda bergantung pada aktiviti mereka pada masa tersebut. Jalankan vmstat 1 semasa ujian dan baca lajur st: steal time yang berterusan melebihi 5 bermakna hos sedang sibuk, dan skor CPU anda rendah disebabkan faktor di luar kawalan mesin anda. Jawapannya terletak pada kaedah, bukannya penalaan. Jalankan setiap ujian lima kali atau lebih pada waktu yang berbeza, kemudian laporkan nilai median berserta julatnya.
Mengapa fio melaporkan berjuta-juta IOPS?
Hampir selalu kerana --direct=1 tiada. Tanpanya, fio membaca melalui kernel page cache, jadi selepas pusingan pertama, fail ujian 2G akan dibekalkan daripada RAM dan anda sebenarnya mengukur lebar jalur memori. Tambahkan --direct=1 dan pastikan fail ujian lebih besar daripada mana-mana cache dalam laluan tersebut. Jika --direct=1 kemudian gagal dengan err=-1/file:ioengines.c:321, func=get_events, error=Unknown error -1, jalankan df -hT .: Type jenis overlay tidak menyokong O_DIRECT, jadi halakan ujian tersebut ke storan sebenar.
Adakah yabs.sh sudah memadai secara sendirian?
Untuk penilaian awal, ya. Ia menjalankan fio pada empat saiz blok, iperf3 dalam kedua-dua arah dan Geekbench, serta mencetak satu ringkasan yang boleh dibaca oleh orang lain. Ia tidak lagi memadai apabila anda ingin mengetahui punca sesuatu angka, kerana anda tidak boleh mengubah flag bagi setiap ujian. Apabila keputusan yabs kelihatan tidak tepat, hasilkan semula keputusan tersebut menggunakan fio atau sysbench secara terus dan ubah satu flag pada satu masa.
Nombor tunggal yang manakah meramalkan prestasi aplikasi saya?
Kelajuan CPU teras tunggal dan kependaman bacaan rawak 4k, mengikut urutan tersebut, bagi kebanyakan beban kerja web dan pangkalan data. Angka throughput kelihatan mengagumkan tetapi jarang menentukan apa-apa, kerana permintaan tipikal adalah kecil. Petik persentil ke-99 daripada blok clat percentiles fio dan bukannya purata, kerana satu permintaan perlahan dalam seratus adalah perkara yang disedari oleh pengguna.
Adakah saya perlu memasang apa-apa sebelum melakukan penanda aras?
fio, sysbench dan iperf3 semuanya terdapat dalam arkib Ubuntu dan Debian: sudo apt install -y fio sysbench iperf3. yabs.sh hanya memerlukan curl, kerana ia memuat turun binari statik untuk sebarang komponen yang tiada. Padamkan setiap fail ujian apabila anda selesai, kerana fail fio 2G yang ditinggalkan pada cakera 20G akan menjadi amaran cakera penuh bagi seseorang beberapa minggu kemudian.