GNU/Linux >> Belajar Linux >  >> Linux

Cara menggunakan speedtest di server Linux untuk memeriksa, menyimpan, dan melaporkan kecepatan internet secara grafis

Mengikuti serangkaian masalah konektivitas broadband yang buruk yang saya alami, saya memutuskan bahwa saya ingin memantau kecepatan Mbps yang saya dapatkan dari penyedia saya secara teratur. Saya melihat angka yang sangat buruk ketika mencoba mengunduh file di malam hari, dengan kecepatan yang jauh lebih cepat dicapai di pagi hari.

Saya memiliki server Linux Debian di sudut, yang merupakan mesin pengujian dan pengembangan saya untuk situs web yang dihosting ISPConfig, serta beberapa kode Let's Encrypt yang ingin saya mainkan, jadi saya mencari beberapa perangkat lunak yang memungkinkan pengujian bandwidth, dapat dijalankan dari baris perintah Linux, yang dapat menjadi dasar sistem skrip shell otomatis untuk menghasilkan data mentah yang saya butuhkan. Saya ingin menyimpan data dalam database SQL untuk membuat kueri menjadi sederhana (saya kemudian dapat dengan mudah mengumpulkan lebih banyak data dan hanya mengekstrak subset yang lebih kecil untuk periode waktu yang saya minati) dan memiliki front-end web yang dapat menghasilkan bagan sederhana untuk memvisualisasikan data dan membantu menyoroti masalah konektivitas.

Hasil pertama pencarian saya adalah artikel yang sangat berguna oleh Antonio Valencia di:https://www.howtoforge.com/tutorial/check-internet-speed-with-speedtest-cli-on-ubuntu/

Setelah mengikuti instruksi di sana untuk menginstal speedtest, permainan cepat menunjukkan bahwa saya dapat menggunakannya untuk menjalankan tes terhadap berbagai server internet dan juga menghasilkan output dalam format CSV, yang cukup cocok untuk diimpor langsung ke tabel SQL dengan upaya minimum dalam pengembangan perangkat lunak.

Untuk jumlah data yang relatif kecil yang akan dihasilkan, saya memutuskan untuk menggunakan SQLite sebagai penyimpanan back-end dan pencarian cepat dari perpustakaan grafik berbasis javascript open-source yang tersedia membawa saya ke chart.js, yang memiliki desain sederhana dan bersih dengan antarmuka data yang sederhana tetapi banyak kemampuan untuk mengubah opsi lanjutan jika diperlukan. Mengonversi data SQL untuk mengekstrak hanya sebagian data yang ingin saya buat grafik dengan output melalui JSON melalui beberapa kode PHP langsung adalah caranya.

Jadi secara keseluruhan saya perlu merancang sistem yang terlihat seperti ini:

Server Linux yang menjalankan speedtest sebagai cronjob - mungkin 1 per jam - dengan output speedtest disimpan dalam database SQLite - semuanya dikendalikan oleh file skrip bash shell. Sebuah web front-end, yang merupakan campuran dari HTML, CSS, javascript, dan PHP untuk mengekstrak data dari SQLite dan menghasilkan diagram batang yang menunjukkan angka Mbps yang dicapai selama 24 jam sebelumnya (atau periode lain yang mungkin saya putuskan).

Sedikit bereksperimen dengan menjalankan speedtest selusin kali secara interaktif menunjukkan kepada saya bahwa ada beberapa server yang tersedia yang tampaknya memberikan hasil yang sangat sesuai dengan jenis kecepatan yang saya alami. Saya menganggap itu ide yang baik untuk menguji lebih dari satu server untuk mendapatkan pemahaman yang lebih baik tentang bagaimana angka Mbps saya dipengaruhi oleh lokasi server target dan waktu dalam zona waktu yang berbeda.

Jika Anda ingin mengikuti dan menyiapkan sistem serupa untuk Anda sendiri, maka Anda harus memilih satu, atau lebih, server dari ratusan server yang tersedia untuk speedtest untuk digunakan yang sesuai dengan lokasi Anda.

1 Prasyarat

  • server linux - Saya menggunakan Debian 9.1 - stretch
  • akses tty ke server dengan login root - Saya menggunakan Putty dari laptop Windows
  • ISPConfig terinstal dan situs web dikonfigurasi dengan akun FTP juga - Saya menggunakan 3.1.6 dengan apache ditetapkan sebagai server web (Anda dapat mengelola hanya dengan server web, dengan beberapa perubahan kecil pada petunjuk berikut)
  • PHP - Saya menggunakan 7.0 tetapi ini juga harus bekerja dengan sebagian besar versi sebelumnya
  • Klien FTP - saya menggunakan Filezilla - dan PureFTPd berjalan di server
  • nano - atau editor visual favorit Anda

Saya berasumsi di sini bahwa Anda merasa nyaman dengan masuk ke server Linux, cara berkeliling direktori, tata letak tempat server web Anda mengharapkan file berada dan bagaimana file FTP ke direktori tersebut.

Berikut adalah langkah-langkah terperinci untuk memungkinkan Anda mengatur semua ini.

2 Penginstalan speedtest

Masuk ke server linux Anda sebagai root dan jalankan perintah:

# pip install speedtest-cli

Lihat https://www.howtoforge.com/tutorial/check-internet-speed-with-speedtest-cli-on-ubuntu/ dan https://pypi.python.org/pypi/speedtest-cli untuk info lebih lanjut jika Anda memiliki masalah.

Catatan:speedtest dan speedtest-cli identik pada pemasangan saya, jadi saya hanya akan merujuk speedtest berikut ini.

3 Instal SQLite3

# apt-get install sqlite3

Gunakan yang setara untuk distro Anda jika apt-get bukan untuk Anda.

4 Buat bandwidth.sh

Masukkan kode skrip bash berikut ke dalam file dan simpan sebagai /usr/local/etc/bandwidth.sh - kami akan mengeditnya nanti untuk membuatnya spesifik untuk Anda.

#!/bin/bash# jalankan speedtests terhadap 3 server dan simpan semua hasil output dalam file CSV untuk diimpor ke sqlite db## dijalankan oleh cronjob sekali per jam##function getCSVString () { # jika speedtest gagal (mis. tidak dapat mengakses server) kita perlu membuat entri nol tiruan untuk slot waktu ini # dapatkan string stempel waktu dalam format yang sama dengan yang dihasilkan oleh speedtest - dan kita memerlukan waktu UTC lokal RIGHTNOW=$(date --utc +%Y- %m-%dT%H:%M:%SZ) # server mana yang kita uji? if [ $1 ="5443" ] lalu echo "5443,Fasthosts Internet,Gloucester,$RIGHTNOW,73.09,0.0,0.0,0.0" fi if [ $1 ="1234" ] lalu echo "1234,Uno,Milton Keynes,$RIGHTNOW ,168.27,0.0,0.0,0.0" fi if [ $1 ="1783" ] lalu echo "1783,Comcast,\"San Francisco, CA\",$RIGHTNOW,8420.0,0.0,0.0,0.0" fi # test/debug kasus hanya jika [ $1 ="1999999999" ] lalu echo "99999,Test,Test,$RIGHTNOW,99,99,0.0,0.0,0.0" fi}fungsi runTest () { # jalankan speedtest terhadap server bernama dengan output csv disimpan dalam file tmp /usr/local/bin/speedtest --csv --server $1> /usr/local/etc/speedtest.tmp if [ $? -gt 0 ] kemudian # speedtest gagal jadi buat entri nol sebagai ganti pesan kesalahan getCSVString $1> /usr/local/etc/speedtest.tmp fi # simpan output siap untuk pengujian server berikutnya cat /usr/local/etc/speedtest .tmp>
> /usr/local/etc/speedtest.csv}# main######## jalankan speedtest terhadap 3 server dan simpan semua hasil keluaran dalam file csv /usr/local/etc# hapus file csv - perlu kosong pada awal runrm -f /usr/local/etc/speedtest.csv########################################## ############## kasus uji/debug - memaksa speedtest gagal############################################################ ################## runTest "199999999"# tidur 5####### berkomentar setelah pengujian ############## ############################################runTest "5443"sleep 10runTest "1234"sleep 10runTest "1783"sleep 1# sekarang impor data csv ke sqlite dbsqlite3 -batch /usr/local/etc/bandwidth.db <<"EOF".separator ",".import /usr/local/etc/speedtest.csv bandwidthEOF# tambahkan csv yang sedang berjalan ke backupcat /usr/local/etc/speedtest.csv>> /usr/local/etc/speedtest.bak

Saya minta maaf atas pendekatan "sabuk dan kawat gigi" saya menggunakan jalur lengkap untuk file di mana saja bahkan saat tidak diperlukan. Itu hanya cara saya suka melakukannya. Jangan ragu untuk meningkatkan ini jika Anda merasa nyaman dengan mengedit skrip bash.

Setel properti file untuk membuat skrip ini dapat dieksekusi:

# chmod 0700 bandwidth.sh

5 Membuat database SQLite

Buat database SQLite bandwidth.db di /usr/local/etc :

#sqlite3 bandwidth.db

dan kemudian, pada prompt sqlite>, buat tabel baru dengan perintah berikut (jangan lewatkan titik koma terakhir):

sqlite> BUAT TABEL JIKA TIDAK ADA "bandwidth" ("serverid" INTEGER NOT NULL , "sponsor" VARCHAR NOT NULL , "servername" VARCHAR NOT NULL , "kali" DATETIME PRIMARY KEY NOT NULL UNIQUE , "jarak" FLOAT NOT NULL , "ping" FLOAT NOT NULL , "download" FLOAT NOT NULL , "upload" FLOAT NOT NULL );
sqlite> .quit

Ini membuat tabel yang disebut bandwidth dengan bidang yang dipetakan langsung ke output format CSV dari speedtest.

6 Dapatkan daftar server

Anda akan memerlukan daftar server yang digunakan speedtest.

# speedtest --list> server.txt

Sekarang periksa melalui server.txt untuk id numerik dari server yang ingin Anda jalankan pengujiannya.

# nano server.txt

File akan terlihat seperti ini:

Mengambil konfigurasi speedtest.net... 5833) Hub Network Services Ltd (Newport, Wales) [57,50 km] 5938) Spectrum Internet (Cardiff, Inggris Raya) [65,89 km] 5443) Fasthosts Internet (Gloucester, Inggris Raya) [74,31 km] 6504) Secure Web Services Ltd (Shrewsbury, Inggris Raya) [78,64 km] 7265) Unitron Systems &Development Ltd (Telford, Inggris Raya) [87,11 km] 8225) Exascale Limited (Wolverhampton, Inggris Raya) [96,08 km ] 3110) zero.net.uk Ltd (Studley, Inggris Raya) [96,12 km]12401) Dragon WiFi LTD (Haverfordwest, Inggris Raya) [120,78 km] 1153) Warwicknet Ltd. (Coventry, Inggris Raya) [125,18 km] 1685 ) Vodafone UK (Newbury, Britania Raya) [153,25 km] 4384) Iomart (Leicester, Britania Raya) [157,40 km] 1234) Uno (Milton Keynes, Britania Raya) [170,71 km] 3504) TNP Ltd. (Manchester, Britania Raya ) [170,93 km]11747) Visa (Manchester, Inggris Raya) [170,93 km]

Id server ada di sisi kiri. Angka di akhir setiap baris adalah perkiraan yang dibuat oleh speedtest dari jarak, dalam kilometer, antara lokasi Anda dan server, meskipun saya tidak yakin itu terlalu akurat dan dapat berubah dari lari ke lari. Server uji akan terdaftar dalam urutan jarak ini dimulai dengan yang terdekat. Pengujian terhadap server di dekat bagian atas daftar ini, secara teori, akan memberi Anda ping tercepat dan kecepatan unduh dan unggah terbaik dibandingkan dengan server di bawah daftar yang jauh lebih jauh.

7 Pilih id server dan edit bandwidth.sh

Sekarang saatnya untuk menjalankan speedtest secara manual terhadap pilihan id server berbeda yang tersedia dan lihat hasil seperti apa yang Anda dapatkan. Saya memilih beberapa server yang dekat dengan saya di Inggris dan satu di California untuk perbandingan. Format perintah yang digunakan adalah:

# tes kecepatan --server 1234

Output yang Anda lihat akan mirip dengan:

Mengambil konfigurasi speedtest.net...Menguji dari xxxxxxx (n.n.n.n)...Mengambil daftar server speedtest.net...Memilih server terbaik berdasarkan ping...Diselenggarakan oleh Uno (Milton Keynes) [187,87 km]:33.243 msMenguji kecepatan unduh.............................................. ..................................Unduh:1,60 Mbit/sMenguji kecepatan unggah........ ........................................................ .....................................Unggah:0,55 Mbit/s

Setelah Anda memilih server yang ingin Anda gunakan, masukkan id server numerik (saya telah menggunakan 3 server tetapi Anda dapat memvariasikan ini jika Anda mau) ke baris yang relevan di bandwidth.sh

runTest "5443"sleep 10runTest "1234"sleep 10runTest "1783"sleep 1

Anda juga perlu menyesuaikan kode dalam rutinitas kesalahan yang membuat entri dummy jika speedtest gagal pada proses tertentu.

 # server mana yang kami uji? if [ $1 ="5443" ] lalu echo "5443,Fasthosts Internet,Gloucester,$RIGHTNOW,73.09,0.0,0.0,0.0" fi if [ $1 ="1234" ] lalu echo "1234,Uno,Milton Keynes,$RIGHTNOW ,168.27,0.0,0.0,0.0" fi if [ $1 ="1783" ] lalu echo "1783,Comcast,\"San Francisco, CA\",$RIGHTNOW,8420.0,0.0,0.0,0.0" fi

Angka setelah $RIGHTNOW di sana (mis. 73.09) adalah jarak dalam kilometer dari lokasi Anda ke server yang dimaksud. Saya tidak menggunakan ini di mana pun sehingga hanya sebagai pengganti dan dapat berupa nilai numerik apa pun.

Perhatikan dengan contoh 1783 itu bahwa kita harus memberi tanda kutip pada lokasi, dan menghindarinya untuk memasukkannya ke dalam file CSV yang kita buat. Kutipan diperlukan di sini karena lokasi ini kebetulan memiliki koma di dalamnya. Tanpa tanda kutip yang lolos, koma akan diperlakukan sebagai pembatas bidang CSV yang akan menyebabkan masalah dengan impor SQLite. Jika server yang Anda pilih memiliki teks lokasi yang mirip dengan koma di dalamnya, maka Anda harus menggunakan tanda kutip yang lolos.

8 Menyiapkan cronjob

Siapkan cronjob untuk dijalankan sekali per jam (atau sesering yang Anda inginkan dengan alasan tertentu) untuk mengeksekusi /usr/local/etc/bandwidth.sh. Jika Anda menjalankan ISPConfig maka Anda dapat menggunakannya untuk menjadwalkan cronjob.

Atau di baris perintah linux Anda dapat memasukkan:

# crontab -e

Anda akan melihat sesuatu yang mirip dengan ini (ingat Anda login sebagai 'root'):

* * * * * /usr/local/ispconfig/server/server.sh 2>&1 | saat membaca baris; lakukan echo `/bin/date` "$line">> /var/log/ispconfig/cron.log; selesai* * * * * /usr/local/ispconfig/server/cron.sh 2>&1 | saat membaca baris; lakukan echo `/bin/date` "$line">> /var/log/ispconfig/cron.log; done1 * * * * /usr/local/etc/bandwidth.sh 2>&1

Jika Anda tidak menjalankan ISPConfig maka ini mungkin awalnya kosong. Tambahkan baris terakhir persis seperti yang ditunjukkan di atas - spasi penting - untuk menjalankan skrip shell mulai pukul 00:01 dan kemudian ulangi setiap jam, setiap hari. Anda dapat memilih waktu yang berbeda tentunya. (Pertama kali Anda menjalankan ini, crontab akan menanyakan editor mana yang ingin Anda gunakan - saya memilih nano.)

9 Menyetel PHP open_basedir

Tambahkan /usr/local/etc ke entri open_basedir PHP untuk situs web. Di ISPConfig, ini ditemukan di tab Opsi untuk Situs Web.

Ini memungkinkan kode bandwidth.php untuk dapat mengakses database SQLite, yang baru saja kita buat, di direktori tersebut.

Kami dapat melewatkan ini jika kami memutuskan untuk membuat database di direktori yang telah ditetapkan sebagai dapat diakses, seperti /var/www/clients/client1/web1/web/, tetapi itu akan menjadi pilihan yang buruk dari perspektif keamanan .

10 Buat bandwidth.php

Anda perlu menyalin kode ini ke file bernama bandwidth.php di server Anda di direktori dokumen web dasar. Jika Anda menggunakan ISPConfig, ini akan menjadi seperti /var/www/clients/client1/web1/web/

   Bandwidth Monitor - kecepatan unduh dalam 24 jam terakhir

Kecepatan unduhan - 24 jam terakhir

Edit file ini untuk menggunakan serverid yang ingin Anda laporkan. Saya menggunakan server 1234 dalam contoh saya di sini, karena saya menemukan bahwa, setelah menjelajahi beberapa hari data, server ini menghasilkan angka Mbps yang paling selaras dengan kecepatan yang saya rasakan. Serverid ada di klausa WHERE dari pernyataan SQL SELECT:

PILIH serverid, strftime("%H:%M", kali) || " " || strftime("%d/%m/%Y", times) AS timestamp, sponsor, servername, 
unduh
DARI bandwidth
WHERE serverid =1234
ORDER BY times
LIMIT 24 OFFSET (PILIH JUMLAH(*)/3 DARI bandwidth)-24;

Apa sebenarnya yang dilakukan pernyataan SQL ini? Jika Anda tidak terbiasa dengan SQL, mari kita lihat setiap bagiannya.

sebuah. SELECT adalah perintah untuk membaca record dari tabel database SQL dan diikuti oleh field yang akan dibaca dan pilihan lainnya.

b. strftime("%H:%M", kali) || " " || strftime("%d/%m/%Y", kali) SEBAGAI stempel waktu

adalah memformat ulang string datetime yang telah dibuat speedtest dalam output CSV-nya menjadi sesuatu yang sedikit lebih ramah pengguna. Saya ingin tanggal berformat Inggris jadi ini akan mengambil string seperti "2017-08-31T12:02:51.898186Z" dan mengubahnya menjadi "12:02 31/08/2017". Lebih mudah untuk melakukan pemformatan ulang ini secara langsung dalam pernyataan SQL daripada harus memprosesnya setelahnya. Waktu di sini adalah UTC/GMT yang tidak masalah bagi saya, tetapi Anda mungkin ingin mengubahnya; misalnya jika Anda ingin tanggal berformat AS, ubah bagian kedua itu menjadi strftime("%m/%d/%Y", times).

c. serverid, timestamp, sponsor, servername, download adalah field yang ingin kita baca dari tabel SQL dan buat di objek JSON kita.

d. FROM bandwidth adalah nama dari tabel SQL yang kita baca.

e. WHERE serverid =1234 menyetel subset tabel yang akan dibaca - ubah ini agar sesuai dengan serverid yang Anda gunakan, dan Anda mungkin ingin membaca data untuk lebih dari satu server - tetapi itu akan memperumit bagan.

f. ORDER BY times menyetel urutan keluaran - kami menginginkannya diurutkan menurut stempel waktu yang ditetapkan speedtest untuk setiap proses.

g. LIMIT 24 membatasi output menjadi 24 record, karena kami hanya ingin menampilkan data senilai 24 jam dan karena cronjob kami diatur untuk berjalan sekali per jam. Jika Anda berlari dua kali dalam satu jam, Anda perlu menyetelnya ke 48 untuk mendapatkan data 24 jam.

h. OFFSET (PILIH JUMLAH(*)/3 DARI bandwidth)-24; kami ingin 24 catatan terakhir dari tabel karena itu adalah entri terbaru yang kami minati sehingga kami harus menentukan OFFSET agar sesuai dengan LIMIT. Tanpa ini, kami akan selalu mendapatkan 24 catatan pertama dalam tabel daripada 24 catatan terbaru. Untuk mendapatkan offset yang tepat, kami menghitung semua catatan dalam tabel dengan (SELECT COUNT(*)) kemudian membaginya dengan 3 (karena kami menjalankan speedtest 3 kali per jam, sekali untuk masing-masing dari 3 server yang berbeda) dan kemudian kurangi 24 dari total tersebut untuk mendapatkan posisi OFFSET yang tepat sehingga LIMIT 24 selanjutnya akan mendapatkan record yang kita inginkan.

Jika Anda telah mengubah skrip bash untuk menjalankan sesuatu selain 3 tes server yang berbeda per jam, maka sesuaikan /3 bagian tersebut. Jika Anda hanya menguji satu server maka pembagian tidak diperlukan sama sekali.

Anda mungkin juga ingin menyesuaikan ukuran keseluruhan bagan, di mana saya telah mengambil rute mudah dari pengkodean keras ukuran yang cocok untuk layar saya - diatur di baris ini:

11 Dapatkan salinan file lokal

Saya lebih suka memiliki versi lokal dari file perpustakaan css dan js (tetapi bukan font Google) yang diperlukan di halaman web dan jika Anda sama maka Anda perlu mendapatkan salinan di server Chart.bundle.min Anda. js dan letakkan di direktori /var/www/clients/client1/web1/web/scripts di server Anda (atau direktori dasar mana pun yang tepat untuk Anda).

Anda dapat mengunduh file dari:https://cdnjs.cloudflare.com/ajax/libs/Chartajs/2.6.0/Chart.bundle.min.js

Jika Anda tidak ingin menggunakan salinan lokal, edit bandwidth.php untuk menunjuk ke versi CDN publik. Ubah saja baris ini:

untuk ini:

12 Aktifkan PHP di ISPConfig

Jangan lupa untuk mengaktifkan PHP pada pengaturan Situs Web Anda, jika ini belum disetel.

13 Muat bandwidth.php di browser

Kami akhirnya selesai. Setelah skrip shell bandwidth.sh memiliki waktu untuk dijalankan beberapa kali untuk menghasilkan beberapa data (atau Anda dapat menjalankannya secara manual beberapa kali pada awalnya) arahkan browser Anda ke situs web server Linux Anda, muat bandwidth.php dan Anda akan melihat sesuatu seperti ini:

Dan ya, broadband saya sangat buruk!

Terakhir, berikut adalah beberapa poin tambahan yang layak dibahas:

14 keluaran Bagan Batang

Kami harus mencatat bahwa angka unduhan dan unggah yang disimpan dalam tabel SQL adalah dalam bps daripada Mbps (bersama dengan angka desimal yang membingungkan - angka seperti 1533681.5922415722). Ini adalah cara speedtest menghasilkan data saat dijalankan dalam mode CSV. Untuk menampilkan angka Mbps, bukan bps, pada output sumbu y dari diagram batang ada beberapa baris yang disertakan dalam kode Javascript di bandwidth.php untuk melakukan konversi:

 mbps =Math.round(bandwidth_data[i].download/1000).toFixed(3)/1000; bvalue =mbps.toLocaleString(undefined, { minimumFractionDigits:3 });

Menggunakan toLocaleString harus memasukkan tanda baca radix desimal yang benar ("." atau ",") seperti yang disetel oleh pengaturan lokal browser Anda, tetapi ini bergantung pada implementasi dan agak tidak konsisten. Jika kamu melihat . alih-alih , dan itu mengganggu Anda maka Globalisasi adalah cara untuk memperbaikinya. Lihat '18 Langkah dan ide lebih lanjut' di bawah ini.

Diperlukan beberapa baris lagi untuk mengganti perlakuan kode hover default dari nol yang tertinggal, karena chart.js biasanya akan menampilkan "2.000" hanya sebagai "2", yang bukan yang saya inginkan, terutama setelah mengalami kesulitan memastikan bahwa mereka ada di sana sejak awal:

 // kita mengganti tooltip default yang menjatuhkan angka nol meskipun kita sudah meletakkannya di sana tooltips:{ callback:{ label:function(tooltipItem, data) { var value =data.datasets[0].data[ tooltipItem.index]; var label ='unduh:'; var retvalue =value.toLocaleString(undefined, { minimumFractionDigits:3 }); kembali label + ' ' + retvalue + ' Mbps'; } } },

Ini adalah contoh yang bagus tentang bagaimana Anda dapat 'menelusuri' ke dalam chart.js dan mengubah cara kerjanya.

Juga, saya telah mengatur opsi bagan untuk mencetak stempel waktu pada sumbu x untuk setiap batang:

 xAxes:[{ ticks:{ autoSkip:false, maxTicksLimit:24 }

Opsi default (dengan autoSkip disetel ke true) menghasilkan beberapa celah yang tampak aneh pada label. Anda perlu mengubah maxTicksLimit jika Anda ingin menampilkan sesuatu selain 24 entri.

Jika Anda ingin bantuan lebih lanjut dalam mengubah salah satu opsi chart.js atau Anda tidak bisa mendapatkan apa yang ingin Anda kerjakan, silakan periksa halaman Stack Overflow chart.js tertentu - ada banyak info berguna di sana - https://stackoverflow .com/questions/tagged/chart.js - Cukup gunakan kotak telusur untuk mempersempit apa yang Anda cari. Sayangnya, dokumentasi chart.js kurang dalam beberapa contoh yang lebih canggih yang tentunya akan sangat membantu untuk mempercepat menggunakan bagian kode sumber terbuka yang hebat ini.

15 Penanganan kesalahan

Selama pengujian awal saya, saya perhatikan beberapa kali bahwa speedtest melaporkan "Tidak dapat mengambil daftar server speedtest" dalam file CSV. Agaknya ini mencerminkan saat-saat ketika koneksi broadband saya sangat buruk sehingga speedtest tidak dapat terhubung ke server pengujian sama sekali. Teks ini jelas tidak dalam format yang ingin kami impor ke database SQLite jadi saya membutuhkan solusi untuk ini yang akan menghapus teks yang tidak diinginkan ini dari file CSV dan juga menyertakan entri nol dalam database untuk slot waktu tertentu, karena jika tidak, setiap entri yang hilang dalam tabel SQL tidak akan terlihat dan juga membuang keselarasan yang saya inginkan untuk memiliki 24 entri per hari saat membuat bagan.

Anda akan melihat di bandwidth.sh bahwa skrip menguji kode keluar yang ditetapkan oleh speedtest menggunakan variabel skrip $? dan jika lebih besar dari nol ini menunjukkan bahwa speedtest gagal. Ini akan memicu fungsi untuk membuat entri CSV tiruan - yang kemudian digunakan untuk menimpa file CSV untuk proses tersebut.

Ada beberapa baris dalam skrip bash yang dikomentari tetapi yang akan menguji rutin kesalahan ini untuk menghasilkan entri nol dummy jika Anda menjalankan skrip setelah menghapus komentar pada baris tersebut.

############################################################# kasus debug - memaksa speedtest gagal############################################################ ## runTest "199999999"# tidur 5####### komentar keluar setelah pengujian ################################### #######################

Ini menggunakan id server 'omong kosong' yang tidak disukai speedtest sehingga menyebabkannya mengembalikan kode keluar yang bukan nol. Script kemudian harus membuat entri dummy yang bisa duduk dengan senang di tabel SQL dan diabaikan atau Anda bisa menghapusnya.

Cara lain untuk memaksa speedtest gagal, untuk tujuan pengujian ini, adalah dengan menghapus koneksi jaringan server. Jangan lupa bahwa Anda dapat menjalankan skrip bandwidth.sh secara manual kapan saja, Anda tidak perlu menunggu cronjob untuk menjalankannya, meskipun Anda harus menghindari menjalankannya secara manual jika cronjob sudah dekat. Menjalankan dua skrip secara bersamaan kemungkinan besar akan mengacaukan file CSV dan tabel SQL.

Jika yang terburuk terjadi, maka ada file CSV cadangan yang disimpan sebagai /usr/local/etc/speedtest.bak yang seharusnya berisi semua keluaran CSV dari speedtest sejak skrip bash dijalankan pertama kali dan seterusnya. Ini dapat diedit untuk menghapus entri yang tidak diinginkan, tabel SQL dibersihkan, dan kemudian seluruh rangkaian entri CSV diimpor kembali ke SQLite.

16 Zona waktu

Speedtest melaporkan waktu dalam UTC (pada dasarnya ini sama dengan Greenwich Mean Time atau GMT). Menggunakan UTC berarti bahwa semua waktu yang disimpan dalam tabel SQL konsisten, dan Waktu Musim Panas tidak akan memiliki dampak yang tidak diinginkan.

Tapi ini berarti bahwa penanganan kesalahan rutin di bandwidth.sh perlu membuat stempel waktu untuk entri dummy untuk mencerminkan hal ini. Ini cukup sederhana - kami baru saja menyertakan flag --utc:

lokal SEKARANG=$(tanggal --utc +%Y-%m-%dT%H:%M:%SZ)

Jika Anda ingin label sumbu x grafik menunjukkan waktu sebagai sesuatu selain UTC/GMT, maka tempat terbaik untuk membuat perubahan seperti itu adalah dalam pernyataan SQL SELECT, mis.:

strftime("%H:%M", waktu(kali, 'waktu lokal')) || " " || strftime("%d/%m/%Y", kali) SEBAGAI stempel waktu

Ini akan menggunakan pengaturan zona waktu server Linux Anda untuk menyesuaikan waktu yang ditunjukkan pada grafik. Atau Anda dapat menyelami untuk mengetahui bagaimana Globalize dapat melakukan ini di front-end.

Lihat https://www.timeanddate.com/time/gmt-utc-time.html dan http://www.tutorialspoint.com/sqlite/sqlite_date_time.htm untuk informasi lebih lanjut.

17 Langkah dan ide lebih lanjut

Speedtest tidak perlu menjadi sumber data mentah Anda - itu bisa datang dari mana saja dan untuk apa saja, bukan hanya kecepatan internet. Prinsipnya sama - proses server backend yang bisa mendapatkan data mentah dalam format yang berguna dan kemudian mengimpornya ke SQLite dari skrip bash dengan front-end yang mengekstrak subset data yang Anda inginkan dan kemudian memetakannya.

Skrip bash yang lebih kompleks dapat menulis data secara langsung ke tabel SQL (menggunakan perintah SQL INSERT) jika memformat sebagai CSV bukanlah pilihan. Saat Anda mendesain tabel SQL, pikirkan tentang bagaimana Anda mungkin ingin mengekstrak data nanti.

Saat membuat perubahan apa pun, ingatlah konteks kode yang Anda edit; yaitu kami memiliki pernyataan SQL di dalam skrip PHP di dalam Javascript di dalam HTML. Ingat level Anda dan kode yang sesuai. Sangat mudah untuk kehilangan jejak dan akhirnya menulis kode PHP dalam apa yang seharusnya menjadi Javascript! Saya jamin ini tidak akan berhasil.

Berikut adalah beberapa ide untuk eksplorasi lebih lanjut:

  • toLocaleString tidak diterapkan secara konsisten di seluruh browser. Gunakan Globalisasi dan tangani semua format nomor, tanggal, dan zona waktu dengannya.
  • Checkout httpstat (ada versi skrip bash) yang memungkinkan berbagai jenis data koneksi internet dikumpulkan. Simpan ini dalam tabel SQL (terpisah) dan buat grafik hasilnya.
  • Tingkatkan front-end bandwidth.php untuk memberi pengguna pilihan opsi yang berbeda:24, 48, 72 jam; pilih tanggal tertentu, sertakan data unggah dan unduh, waktu ping.
  • Konversi HTML untuk menggunakan kode Bootstrap responsif sehingga berjalan dengan baik di berbagai perangkat atau ukuran layar.
  • Jelajahi beberapa opsi lain dari chart.js; mungkin gabungan garis dan diagram batang; ubah warna dan ukuran bilah.
  • ganti SQLite dengan MySQL dan tambahkan keamanan lebih dengan akses baca dari PHP melalui pengguna/sandi.
  • Bangun sistem serupa tetapi menggunakan node.js.
  • tes kecepatan:https://github.com/sivel/speedtest-cli
  • SQLite3:https://sqlite.org/
  • chart.js:http://www.chartjs.org/
  • Globalisasi:https://github.com/globalizejs/globalize
  • httpstat:https://github.com/b4b4r07/httpstat
  • Bootstrap:http://getbootstrap.com/
  • PHP:http://www.php.net/
  • ISPConfig:http://www.ispconfig.org/
  • Debian:http://www.debian.org/

Linux
  1. Apa itu Perintah Chown di Linux dan Cara Menggunakannya

  2. Cara Menginstal Dan Menggunakan Flatpak Di Linux

  3. Cara Menginstal dan Menggunakan Traceroute di Linux

  1. Cara mengatur dan menggunakan Server FTP di Ubuntu Linux

  2. Cara menginstal dan menggunakan telnet di Kali Linux

  3. Cara Menginstal dan Menggunakan Alat Baris Perintah Mosh Linux

  1. Bagaimana Cara Menginstal dan Menggunakan Layar Linux?

  2. Perintah Tail Linux:Apa Itu dan Bagaimana Cara Menggunakannya

  3. Cara Menginstal dan Menggunakan SSHFS di Linux