Tiếp theo sau một loạt các vấn đề về kết nối băng thông rộng kém mà tôi đã gặp phải, tôi quyết định rằng tôi muốn theo dõi tốc độ Mbps mà tôi nhận được từ nhà cung cấp của mình một cách thường xuyên. Tôi đã thấy những con số đặc biệt kém khi cố gắng tải xuống các tệp vào buổi tối, với tốc độ nhanh hơn nhiều đạt được vào sáng sớm.
Tôi có một máy chủ Linux Debian đặt ở một góc, đó là máy thử nghiệm và phát triển của tôi cho các trang web được lưu trữ trên ISPConfig, cũng như một số mã Let's Encrypt mà tôi thích nghịch ngợm, vì vậy tôi đã tìm kiếm một số phần mềm cho phép kiểm tra băng thông, có thể chạy từ dòng lệnh Linux, có thể tạo thành cơ sở của một hệ thống tập lệnh shell tự động để tạo ra dữ liệu thô mà tôi cần. Tôi muốn lưu trữ dữ liệu trong cơ sở dữ liệu SQL để đơn giản hóa việc truy vấn (sau đó tôi có thể dễ dàng thu thập thêm dữ liệu và chỉ trích xuất một tập hợp con nhỏ hơn cho các khoảng thời gian mà tôi quan tâm) và có một giao diện web có thể tạo biểu đồ đơn giản để trực quan hóa dữ liệu và giúp làm nổi bật các vấn đề về kết nối.
Kết quả đầu tiên khi tìm kiếm là bài viết thực sự hữu ích của Antonio Valencia tại: https://www.howtoforge.com/tutorial/check-internet-speed-with-speedtest-cli-on-ubuntu/
Sau khi làm theo hướng dẫn ở đó để cài đặt speedtest, một lần chạy thử nhanh cho thấy tôi có thể sử dụng nó để chạy thử nghiệm trên một tập hợp lớn các máy chủ internet và cũng tạo ra đầu ra ở định dạng CSV, khá phù hợp để nhập trực tiếp vào bảng SQL với lượng công sức tối thiểu trong quá trình phát triển phần mềm.
Đối với lượng dữ liệu tương đối nhỏ sẽ được tạo ra, tôi quyết định sử dụng SQLite làm kho lưu trữ phụ trợ và tìm kiếm nhanh các thư viện đồ thị dựa trên javascript nguồn mở có sẵn đã dẫn tôi đến chart.js, có thiết kế đơn giản, gọn gàng với giao diện dữ liệu đơn giản nhưng có nhiều khả năng để điều chỉnh các tùy chọn nâng cao nếu cần. Chuyển đổi dữ liệu SQL để trích xuất chỉ tập hợp con dữ liệu mà tôi muốn biểu đồ với đầu ra qua JSON thông qua một số mã PHP đơn giản là cách thực hiện.
Vì vậy, nhìn chung tôi cần thiết kế một hệ thống trông như thế này:
Một máy chủ Linux chạy speedtest dưới dạng cronjob - có thể là 1 lần mỗi giờ - với đầu ra speedtest được lưu trữ trong cơ sở dữ liệu SQLite - tất cả được kiểm soát bởi tệp tập lệnh bash shell. Giao diện web front-end, là sự kết hợp của HTML, CSS, javascript và PHP để trích xuất dữ liệu từ SQLite và tạo biểu đồ thanh hiển thị số liệu Mbps đạt được trong 24 giờ trước đó (hoặc bất kỳ khoảng thời gian nào khác mà tôi có thể quyết định).
Thử nghiệm một chút bằng cách chạy speedtest khoảng một chục lần theo cách tương tác cho tôi thấy rằng có một số máy chủ khả dụng dường như cung cấp kết quả gần giống với loại tốc độ mà tôi đang trải nghiệm. Tôi cho rằng nên thử nghiệm với nhiều máy chủ hơn để nắm rõ hơn về cách số liệu Mbps của tôi bị ảnh hưởng bởi vị trí của máy chủ mục tiêu và thời gian trong ngày ở múi giờ khác.
Nếu bạn muốn theo dõi và thiết lập một hệ thống tương tự cho riêng mình, thì bạn sẽ cần chọn một hoặc nhiều máy chủ trong số hàng trăm máy chủ có sẵn để speedtest sử dụng phù hợp với vị trí của mình.
Sau đây là các bước chi tiết cho phép bạn thiết lập tất cả những điều này.
Xem https://www.howtoforge.com/tutorial/check-internet-speed-with-speedtest-cli-on-ubuntu/ và https://pypi.python.org/pypi/speedtest-cli để biết thêm thông tin nếu bạn có bất kỳ vấn đề.
Lưu ý: speedtest và speedtest-cli giống hệt nhau trên bản cài đặt của tôi nên tôi sẽ chỉ tham chiếu speedtest trong phần sau.
Sử dụng lệnh tương đương cho bản phân phối của bạn nếu apt-get không dành cho bạn.
Tôi xin lỗi vì cách tiếp cận "thắt lưng buộc bụng" của mình là sử dụng đường dẫn đầy đủ cho các tệp ở mọi nơi ngay cả khi không cần thiết. Đây chỉ là cách tôi thích làm. Bạn có thể thoải mái cải thiện cách này nếu bạn thấy thoải mái khi chỉnh sửa các tập lệnh bash.
Đặt thuộc tính tệp để làm cho tập lệnh này có thể thực thi:
và sau đó, tại dấu nhắc sqlite>, hãy tạo một bảng mới bằng lệnh sau (đừng bỏ dấu chấm phẩy cuối cùng):
Điều này tạo ra một bảng có tên là băng thông với các trường ánh xạ trực tiếp vào đầu ra định dạng CSV của speedtest.
Bây giờ hãy kiểm tra thông qua servers.txt để biết các id số của máy chủ mà bạn muốn chạy thử nghiệm.
Tệp sẽ trông tương tự như thế này:
ID máy chủ nằm ở phía bên trái. Con số ở cuối mỗi dòng là ước tính mà speedtest đã đưa ra về khoảng cách, tính bằng kilômét, giữa vị trí của bạn và máy chủ, mặc dù tôi không chắc rằng nó quá chính xác và nó có thể thay đổi từ lần chạy này sang lần chạy khác. Các máy chủ thử nghiệm sẽ được liệt kê theo thứ tự khoảng cách này bắt đầu từ gần nhất. Về mặt lý thuyết, việc thử nghiệm với các máy chủ gần đầu danh sách này sẽ cung cấp cho bạn ping nhanh nhất và tốc độ tải xuống và tải lên tốt nhất so với các máy chủ ở phía dưới danh sách, vốn ở xa hơn nhiều.
Đầu ra bạn thấy sẽ tương tự như sau:
Sau khi đã chọn máy chủ muốn sử dụng, hãy nhập số ID máy chủ (tôi đã sử dụng 3 máy chủ nhưng bạn có thể thay đổi nếu muốn) vào các dòng có liên quan trong broadband.sh
Bạn cũng sẽ cần phải điều chỉnh mã trong quy trình lỗi tạo ra một mục nhập giả nếu speedtest không thành công trong bất kỳ lần chạy cụ thể nào.
Các số sau $RIGHTNOW trong đó (ví dụ: 73.09) là khoảng cách tính bằng kilômét từ vị trí của bạn đến máy chủ đang đề cập. Tôi không sử dụng chúng ở bất kỳ đâu nên chúng chỉ là một trình giữ chỗ và có thể là bất kỳ giá trị số nào.
Lưu ý với ví dụ 1783 đó là chúng ta phải đặt dấu ngoặc kép vào vị trí và thoát chúng để đưa chúng vào tệp CSV mà chúng ta đang tạo. Dấu ngoặc kép là bắt buộc ở đây vì vị trí này tình cờ có dấu phẩy bên trong. Nếu không có dấu ngoặc kép thoát, dấu phẩy sẽ được coi là dấu phân cách trường CSV, điều này sẽ gây ra sự cố với quá trình nhập SQLite. Nếu máy chủ bạn chọn có văn bản vị trí tương tự có dấu phẩy trong đó thì bạn sẽ cần sử dụng dấu ngoặc kép thoát.
Ngoài ra, tại dòng lệnh linux, bạn có thể nhập:
Bạn sẽ thấy nội dung tương tự như thế này (hãy nhớ rằng bạn đã đăng nhập với tư cách là 'root'):
Nếu bạn không chạy ISPConfig thì ban đầu có thể nó sẽ trống. Thêm dòng cuối cùng chính xác như hiển thị ở trên - khoảng cách rất quan trọng - để chạy tập lệnh shell bắt đầu từ 00:01 AM và sau đó lặp lại mỗi giờ, mỗi ngày. Tất nhiên, bạn có thể chọn các thời điểm khác nhau. (Lần đầu tiên bạn chạy lệnh này, crontab sẽ hỏi bạn muốn sử dụng trình soạn thảo nào - tôi chọn nano.)
Điều này cho phép mã bandwidth.php có thể truy cập cơ sở dữ liệu SQLite mà chúng ta vừa tạo trong thư mục đó.
Chúng ta có thể bỏ qua mục này nếu quyết định tạo cơ sở dữ liệu trong thư mục đã được thiết lập là có thể truy cập, chẳng hạn như /var/www/clients/client1/web1/web/, nhưng đó sẽ là lựa chọn kém về mặt bảo mật.
Chỉnh sửa tệp này để sử dụng serverid mà bạn muốn báo cáo. Tôi đang sử dụng máy chủ 1234 trong ví dụ của mình ở đây, vì tôi thấy rằng, sau khi khám phá dữ liệu trong vài ngày, máy chủ này tạo ra các số liệu Mbps gần nhất với tốc độ mà tôi cảm thấy mình đang nhận được. Serverid nằm trong mệnh đề WHERE của câu lệnh SQL SELECT:
Câu lệnh SQL này thực sự có tác dụng gì? Nếu bạn không quen với SQL thì hãy cùng xem từng phần.
a. SELECT là lệnh đọc bản ghi từ bảng cơ sở dữ liệu SQL và theo sau là các trường cần đọc và các tùy chọn khác.
b. strftime("%H:%M", times) || " " || strftime("%d/%m/%Y", times) AS timestamp
là định dạng lại chuỗi ngày giờ mà speedtest đã tạo trong đầu ra CSV thành thứ gì đó thân thiện hơn với người dùng. Tôi muốn định dạng ngày theo Vương quốc Anh nên lệnh này sẽ lấy một chuỗi như "2017-08-31T12:02:51.898186Z" và biến thành "12:02 31/08/2017". Định dạng lại trực tiếp trong câu lệnh SQL sẽ đơn giản hơn là phải xử lý sau đó. Thời gian ở đây sẽ là UTC/GMT, với tôi thì ổn, nhưng bạn có thể muốn thay đổi; ví dụ: nếu bạn muốn định dạng ngày theo Hoa Kỳ thì hãy đổi phần thứ hai thành strftime("%m/%d/%Y", times).
c. serverid, timestamp, sponsor, servername, download là các trường chúng ta muốn đọc từ bảng SQL và tạo trong đối tượng JSON của mình.
d. FROM broadband là tên của bảng SQL mà chúng ta đang đọc.
e. WHERE serverid = 1234 thiết lập tập hợp con của bảng cần đọc - hãy thay đổi để khớp với serverid bạn đã sử dụng và bạn có thể muốn đọc dữ liệu cho nhiều máy chủ - nhưng điều đó sẽ làm phức tạp biểu đồ.
f. ORDER BY times thiết lập thứ tự sắp xếp của đầu ra - chúng ta muốn nó được sắp xếp theo dấu thời gian mà speedtest đặt cho mỗi lần chạy.
g. LIMIT 24 giới hạn đầu ra ở 24 bản ghi, vì chúng ta chỉ muốn hiển thị dữ liệu trong 24 giờ và vì cronjob của chúng ta được thiết lập để chạy một lần mỗi giờ. Nếu bạn chạy hai lần một giờ thì bạn sẽ cần đặt thành 48 để có được dữ liệu trong 24 giờ.
h. OFFSET (SELECT COUNT(*)/3 FROM bandwidth)-24; chúng ta muốn 24 bản ghi cuối cùng từ bảng vì chúng là các mục gần đây nhất mà chúng ta quan tâm nên chúng ta phải chỉ định OFFSET để khớp với LIMIT. Nếu không có điều này, chúng ta sẽ luôn nhận được 24 bản ghi đầu tiên trong bảng thay vì 24 bản ghi gần đây nhất. Để có được độ lệch đúng, chúng ta đếm tất cả các bản ghi trong bảng bằng (SELECT COUNT(*)) sau đó chia cho 3 (vì chúng ta đang chạy speedtest 3 lần mỗi giờ, một lần cho mỗi máy chủ khác nhau trong số 3 máy chủ khác nhau) rồi trừ 24 khỏi tổng số này để có được vị trí OFFSET đúng để LIMIT 24 sau đó sẽ nhận được các bản ghi mà chúng ta muốn.
Nếu bạn đã thay đổi tập lệnh bash để chạy thứ gì đó khác ngoài 3 bài kiểm tra máy chủ khác nhau mỗi giờ thì hãy điều chỉnh phần /3 đó cho phù hợp. Nếu bạn chỉ thử nghiệm trên một máy chủ thì không cần phải chia.
Bạn cũng có thể muốn điều chỉnh kích thước tổng thể của biểu đồ, trong đó tôi đã thực hiện theo cách dễ dàng là mã hóa cứng một kích thước phù hợp với màn hình của tôi - nó được đặt trong dòng này:
Bạn có thể tải tệp xuống từ: https://cdnjs.cloudflare.com/ajax/libs/Chartajs/2.6.0/Chart.bundle.min.js
Nếu bạn không muốn sử dụng bản sao cục bộ thì hãy chỉnh sửa bandwidth.php để trỏ đến phiên bản CDN công khai. Chỉ cần thay đổi dòng này:
thành dòng này:
Và đúng vậy, băng thông rộng của tôi tệ đến thế cơ mà!
Cuối cùng, đây là một vài điểm đáng lưu ý:
Sử dụng toLocaleString sẽ chèn đúng dấu chấm câu cơ số thập phân (a "." hoặc ",") theo cài đặt ngôn ngữ của trình duyệt nhưng điều này phụ thuộc vào việc triển khai và có phần không nhất quán. Nếu bạn thấy . thay vì , và điều đó làm bạn khó chịu thì Globalize là cách khắc phục sự cố này. Xem '18 bước và ý tưởng tiếp theo' bên dưới.
Cần thêm một vài dòng nữa để ghi đè cách xử lý mã di chuột mặc định là các số 0 theo sau, vì chart.js thường sẽ hiển thị "2.000" thành "2", đây không phải là điều tôi muốn, đặc biệt là sau khi đã mất công đảm bảo rằng chúng có ở đó ngay từ đầu:
Đây là một ví dụ hay về cách bạn có thể 'đi sâu' vào chart.js và thay đổi cách thức hoạt động của nó.
Ngoài ra, tôi đã thiết lập các tùy chọn biểu đồ để in dấu thời gian trên trục x cho mọi thanh:
Tùy chọn mặc định (với autoSkip được đặt thành true) dẫn đến một vài khoảng trống trông kỳ lạ trong các nhãn. Bạn sẽ cần phải thay đổi maxTicksLimit nếu bạn muốn hiển thị thứ gì đó khác ngoài 24 mục.
Nếu bạn muốn được trợ giúp thêm trong việc thay đổi bất kỳ tùy chọn nào của chart.js hoặc bạn không thể có được thứ mình muốn thì vui lòng kiểm tra các trang Stack Overflow của chart.js cụ thể - có rất nhiều thông tin hữu ích ở đó - https://stackoverflow.com/questions/tagged/chart.js - Chỉ cần sử dụng hộp tìm kiếm để thu hẹp những gì bạn đang tìm kiếm. Thật không may, tài liệu chart.js thiếu một số ví dụ nâng cao hơn chắc chắn sẽ rất hữu ích để bắt kịp tốc độ sử dụng đoạn mã nguồn mở tuyệt vời này.
Bạn sẽ thấy trong broadband.sh rằng tập lệnh kiểm tra mã thoát do speedtest đặt bằng cách sử dụng biến tập lệnh $? và nếu nó lớn hơn không thì điều này cho biết speedtest đã thất bại. Điều này sẽ kích hoạt hàm để tạo một mục nhập CSV giả - sau đó được sử dụng để ghi đè tệp CSV cho lần chạy đó.
Có một vài dòng trong tập lệnh bash được chú thích nhưng sẽ kiểm tra quy trình lỗi này để tạo một mục nhập số không giả nếu bạn chạy tập lệnh sau khi bỏ chú thích những dòng đó.
Điều này sử dụng một id máy chủ 'vô nghĩa' mà speedtest không thích, do đó khiến nó trả về một mã thoát khác không. Sau đó, tập lệnh sẽ tạo một mục nhập giả có thể nằm trong bảng SQL và bị bỏ qua hoặc bạn có thể xóa nó.
Một cách khác để buộc speedtest không thành công, cho mục đích thử nghiệm này, là xóa kết nối mạng của máy chủ. Đừng quên rằng bạn có thể chạy tập lệnh bandwidth.sh theo cách thủ công bất kỳ lúc nào, bạn không phải đợi cronjob kích hoạt nó, mặc dù bạn nên tránh chạy nó theo cách thủ công nếu cronjob sắp xảy ra. Việc chạy hai tập lệnh cùng lúc có thể làm hỏng các tệp CSV và sau đó là bảng SQL.
Nếu điều tệ nhất xảy ra thì sẽ có một tệp CSV dự phòng được lưu dưới dạng /usr/local/etc/speedtest.bak chứa tất cả đầu ra CSV từ speedtest từ lần chạy đầu tiên của tập lệnh bash trở đi. Có thể chỉnh sửa tệp này để xóa bất kỳ mục nhập không mong muốn nào, xóa bảng SQL và sau đó nhập lại toàn bộ tập hợp các mục nhập CSV vào SQLite.
Nhưng điều này có nghĩa là quy trình xử lý lỗi trong broadband.sh cần tạo dấu thời gian cho mục nhập giả để phản ánh điều này. Điều này khá đơn giản - chúng tôi chỉ cần thêm cờ --utc:
Nếu bạn muốn nhãn trục x của biểu đồ hiển thị thời gian theo một cách khác ngoài UTC/GMT thì nơi tốt nhất để thực hiện thay đổi như vậy sẽ là trong câu lệnh SQL SELECT, ví dụ:
Điều này sẽ sử dụng cài đặt múi giờ của máy chủ Linux của bạn để điều chỉnh thời gian hiển thị trên biểu đồ. Hoặc bạn có thể tìm hiểu cách Globalize có thể thực hiện điều này ở giao diện người dùng.
Xem https://www.timeanddate.com/time/gmt-utc-time.html và http://www.tutorialspoint.com/sqlite/sqlite_date_time.htm để biết thêm thông tin.
Một tập lệnh bash phức tạp hơn có thể ghi dữ liệu trực tiếp vào bảng SQL (sử dụng lệnh SQL INSERT) nếu định dạng dưới dạng CSV không phải là một tùy chọn. Khi bạn thiết kế bảng SQL, hãy nghĩ về cách bạn có thể muốn trích xuất dữ liệu sau đó.
Khi thực hiện bất kỳ thay đổi nào, hãy ghi nhớ ngữ cảnh của mã bạn đang chỉnh sửa; tức là chúng ta có các câu lệnh SQL bên trong tập lệnh PHP bên trong Javascript bên trong HTML. Hãy nhớ cấp độ bạn đang ở và mã hóa cho phù hợp. Bạn có thể dễ dàng mất dấu và kết thúc bằng việc viết mã PHP bằng thứ lẽ ra phải là Javascript! Tôi đảm bảo điều này sẽ không hiệu quả.
Sau đây là một số ý tưởng để khám phá thêm:
Tôi có một máy chủ Linux Debian đặt ở một góc, đó là máy thử nghiệm và phát triển của tôi cho các trang web được lưu trữ trên ISPConfig, cũng như một số mã Let's Encrypt mà tôi thích nghịch ngợm, vì vậy tôi đã tìm kiếm một số phần mềm cho phép kiểm tra băng thông, có thể chạy từ dòng lệnh Linux, có thể tạo thành cơ sở của một hệ thống tập lệnh shell tự động để tạo ra dữ liệu thô mà tôi cần. Tôi muốn lưu trữ dữ liệu trong cơ sở dữ liệu SQL để đơn giản hóa việc truy vấn (sau đó tôi có thể dễ dàng thu thập thêm dữ liệu và chỉ trích xuất một tập hợp con nhỏ hơn cho các khoảng thời gian mà tôi quan tâm) và có một giao diện web có thể tạo biểu đồ đơn giản để trực quan hóa dữ liệu và giúp làm nổi bật các vấn đề về kết nối.
Kết quả đầu tiên khi tìm kiếm là bài viết thực sự hữu ích của Antonio Valencia tại: https://www.howtoforge.com/tutorial/check-internet-speed-with-speedtest-cli-on-ubuntu/
Sau khi làm theo hướng dẫn ở đó để cài đặt speedtest, một lần chạy thử nhanh cho thấy tôi có thể sử dụng nó để chạy thử nghiệm trên một tập hợp lớn các máy chủ internet và cũng tạo ra đầu ra ở định dạng CSV, khá phù hợp để nhập trực tiếp vào bảng SQL với lượng công sức tối thiểu trong quá trình phát triển phần mềm.
Đối với lượng dữ liệu tương đối nhỏ sẽ được tạo ra, tôi quyết định sử dụng SQLite làm kho lưu trữ phụ trợ và tìm kiếm nhanh các thư viện đồ thị dựa trên javascript nguồn mở có sẵn đã dẫn tôi đến chart.js, có thiết kế đơn giản, gọn gàng với giao diện dữ liệu đơn giản nhưng có nhiều khả năng để điều chỉnh các tùy chọn nâng cao nếu cần. Chuyển đổi dữ liệu SQL để trích xuất chỉ tập hợp con dữ liệu mà tôi muốn biểu đồ với đầu ra qua JSON thông qua một số mã PHP đơn giản là cách thực hiện.
Vì vậy, nhìn chung tôi cần thiết kế một hệ thống trông như thế này:
Một máy chủ Linux chạy speedtest dưới dạng cronjob - có thể là 1 lần mỗi giờ - với đầu ra speedtest được lưu trữ trong cơ sở dữ liệu SQLite - tất cả được kiểm soát bởi tệp tập lệnh bash shell. Giao diện web front-end, là sự kết hợp của HTML, CSS, javascript và PHP để trích xuất dữ liệu từ SQLite và tạo biểu đồ thanh hiển thị số liệu Mbps đạt được trong 24 giờ trước đó (hoặc bất kỳ khoảng thời gian nào khác mà tôi có thể quyết định).
Thử nghiệm một chút bằng cách chạy speedtest khoảng một chục lần theo cách tương tác cho tôi thấy rằng có một số máy chủ khả dụng dường như cung cấp kết quả gần giống với loại tốc độ mà tôi đang trải nghiệm. Tôi cho rằng nên thử nghiệm với nhiều máy chủ hơn để nắm rõ hơn về cách số liệu Mbps của tôi bị ảnh hưởng bởi vị trí của máy chủ mục tiêu và thời gian trong ngày ở múi giờ khác.
Nếu bạn muốn theo dõi và thiết lập một hệ thống tương tự cho riêng mình, thì bạn sẽ cần chọn một hoặc nhiều máy chủ trong số hàng trăm máy chủ có sẵn để speedtest sử dụng phù hợp với vị trí của mình.
1Điều kiện tiên quyết
- Máy chủ Linux - Tôi đang sử dụng Debian 9.1 - mở rộng
- truy cập tty vào máy chủ bằng thông tin đăng nhập gốc - Tôi sử dụng PuTTY từ máy tính xách tay Windows
- Cài đặt ISPConfig và cấu hình trang web bằng tài khoản FTP - Tôi đang sử dụng 3.1.6 với apache được đặt làm máy chủ web (bạn có thể quản lý chỉ bằng máy chủ web, với một vài thay đổi nhỏ đối với các hướng dẫn sau)
- PHP - Tôi đang sử dụng 7.0 nhưng điều này cũng có thể hoạt động với hầu hết các phiên bản trước đó
- Máy khách FTP - Tôi sử dụng Filezilla - và PureFTPd chạy trên máy chủ
- nano - hoặc trình chỉnh sửa trực quan yêu thích của bạn
Sau đây là các bước chi tiết cho phép bạn thiết lập tất cả những điều này.
2Cài đặt speedtest
Đăng nhập vào máy chủ Linux của bạn với tư cách là root và chạy lệnh:
Mã:
# pip install speedtest-cli
Lưu ý: speedtest và speedtest-cli giống hệt nhau trên bản cài đặt của tôi nên tôi sẽ chỉ tham chiếu speedtest trong phần sau.
3Cài đặt SQLite3
Mã:
# apt-get install sqlite3
4Tạo bandwidth.sh
Nhập mã lệnh bash sau vào tệp và lưu dưới dạng /usr/local/etc/bandwidth.sh - chúng tôi sẽ chỉnh sửa mã này sau một chút để làm cho nó cụ thể hơn đối với bạn.
Mã:
#!/bin/bash# chạy speedtests trên 3 máy chủ và lưu tất cả kết quả đầu ra trong tệp CSV để nhập vào cơ sở dữ liệu sqlite## chạy bằng cronjob một lần mỗi giờ##function getCSVString () { # nếu speedtest không thành công (ví dụ: không thể truy cập máy chủ), chúng ta cần tạo một mục nhập số không giả cho khoảng thời gian này # lấy chuỗi dấu thời gian theo cùng định dạng mà speedtest tạo ra - và chúng ta cần thời gian UTC local RIGHTNOW=$(date --utc +%Y-%m-%dT%H:%M:%SZ) # chúng ta đang thử nghiệm trên máy chủ nào? nếu [ $1 = "5443" ] thì echo "5443, Fasthosts Internet, Gloucester, $RIGHTNOW, 73.09, 0.0, 0.0, 0.0" fi nếu [ $1 = "1234" ] thì echo "1234, Uno, Milton Keynes, $RIGHTNOW, 168.27, 0.0, 0.0, 0.0" fi nếu [ $1 = "1783" ] thì echo "1783, Comcast, \"San Francisco, CA\", $RIGHTNOW, 8420.0, 0.0, 0.0, 0.0" fi# chỉ kiểm tra/gỡ lỗi trường hợp nếu [ $1 = "199999999" ] thì echo "99999, Test, Test, $RIGHTNOW, 99.99, 0.0, 0.0, 0.0" fi}hàm runTest () { # chạy speedtest trên máy chủ được đặt tên với đầu ra csv được lưu trong tệp tmp /usr/local/bin/speedtest --csv --server $1 > /usr/local/etc/speedtest.tmp nếu [ $? -gt 0 ] thì # speedtest không thành công nên hãy tạo mục nhập số không thay cho bất kỳ thông báo lỗi nào getCSVString $1 > /usr/local/etc/speedtest.tmp fi # lưu đầu ra sẵn sàng cho thử nghiệm máy chủ tiếp theo cat /usr/local/etc/speedtest.tmp >> /usr/local/etc/speedtest.csv}# main######## chạy speedtest trên 3 máy chủ và lưu tất cả kết quả đầu ra vào tệp csvcd /usr/local/etc# xóa tệp csv - cần phải trống khi bắt đầu chạyrm -f /usr/local/etc/speedtest.csv##################################################### trường hợp kiểm tra/gỡ lỗi - buộc speedtest không thành công#################################################### runTest "199999999"# sleep 5####### bình luận sau khi kiểm tra #########################################################runTest "5443"sleep 10runTest "1234"sleep 10runTest "1783"sleep 1# bây giờ nhập dữ liệu csv vào sqlite dbsqlite3 -batch /usr/local/etc/bandwidth.db /usr/local/etc/speedtest.bak
Đặt thuộc tính tệp để làm cho tập lệnh này có thể thực thi:
Mã:
# chmod 0700 bandwidth.sh
5Tạo cơ sở dữ liệu SQLite
Tạo cơ sở dữ liệu SQLite bandwidth.db trong /usr/local/etc:
Mã:
#sqlite3 bandwidth.db
Mã:
sqlite> CREATE TABLE IF NOT EXISTS "bandwidth" ("serverid" INTEGER NOT NULL, "sponsor" VARCHAR NOT NULL, "servername" VARCHAR NOT NULL, "times" DATETIME PRIMARY KEY NOT NULL UNIQUE, "distance" FLOAT NOT NULL, "ping" FLOAT NOT NULL, "download" FLOAT NOT NULL, "upload" FLOAT NOT NULL);
Mã:
sqlite> .quit
6Lấy danh sách các máy chủ
Bạn sẽ cần danh sách các máy chủ mà speedtest sử dụng.
Mã:
# speedtest --list > servers.txt
Mã:
# nano servers.txt
Mã:
Đang truy xuất cấu hình speedtest.net... 5833) Hub Network Services Ltd (Newport, Wales) [57,50 km] 5938) Spectrum Internet (Cardiff, Vương quốc Anh) [65,89 km] 5443) Fasthosts Internet (Gloucester, Vương quốc Anh) [74,31 km] 6504) Secure Web Services Ltd (Shrewsbury, Vương quốc Anh) [78,64 km] 7265) Unitron Systems & Development Ltd (Telford, Vương quốc Anh) [87,11 km] 8225) Exascale Limited (Wolverhampton, Vương quốc Anh) [96,08 km] 3110) zero.net.uk Ltd (Studley, Vương quốc Anh) [96,12 km]12401) Dragon WiFi LTD (Haverfordwest, Vương quốc Anh) [120,78 km] 1153) Warwicknet Ltd. (Coventry, Vương quốc Anh) [125,18 km] 1685) Vodafone UK (Newbury, Vương quốc Anh) [153,25 km] 4384) Iomart (Leicester, Vương quốc Anh) [157,40 km] 1234) Uno (Milton Keynes, Vương quốc Anh) [170,71 km] 3504) TNP Ltd. (Manchester, Vương quốc Anh) [170,93 km]11747) Vispa (Manchester, Vương quốc Anh) [170,93 km]
7Chọn id máy chủ và chỉnh sửa băng thông.sh
Bây giờ là lúc chạy speedtest thủ công so với một số id máy chủ khác nhau có sẵn và xem bạn nhận được loại kết quả nào. Tôi đã chọn một vài máy chủ gần mình ở Vương quốc Anh và một máy chủ ở California để so sánh. Định dạng lệnh sử dụng là:
Mã:
# speedtest --server 1234
Mã:
Đang truy xuất cấu hình speedtest.net...Đang kiểm tra từ xxxxxxx (n.n.n.n)...Đang truy xuất danh sách máy chủ speedtest.net...Đang chọn máy chủ tốt nhất dựa trên ping...Được lưu trữ bởi Uno (Milton Keynes) [187,87 km]: 33,243 msĐang kiểm tra tốc độ tải xuống.................................................................Tải xuống: 1,60 Mbit/giâyĐang kiểm tra tốc độ tải lên..................................................................................Tải lên: 0,55 Mbit/giây
Mã:
runTest "5443"sleep 10runTest "1234"sleep 10runTest "1783"sleep 1
Mã:
# chúng ta đang thử nghiệm trên máy chủ nào? nếu [ $1 = "5443" ] thì echo "5443,Fasthosts Internet,Gloucester,$RIGHTNOW,73.09,0.0,0.0,0.0" fi nếu [ $1 = "1234" ] thì echo "1234,Uno,Milton Keynes,$RIGHTNOW,168.27,0.0,0.0,0.0" fi nếu [ $1 = "1783" ] thì echo "1783,Comcast,\"San Francisco, CA\",$RIGHTNOW,8420.0,0.0,0.0,0.0" fi
Lưu ý với ví dụ 1783 đó là chúng ta phải đặt dấu ngoặc kép vào vị trí và thoát chúng để đưa chúng vào tệp CSV mà chúng ta đang tạo. Dấu ngoặc kép là bắt buộc ở đây vì vị trí này tình cờ có dấu phẩy bên trong. Nếu không có dấu ngoặc kép thoát, dấu phẩy sẽ được coi là dấu phân cách trường CSV, điều này sẽ gây ra sự cố với quá trình nhập SQLite. Nếu máy chủ bạn chọn có văn bản vị trí tương tự có dấu phẩy trong đó thì bạn sẽ cần sử dụng dấu ngoặc kép thoát.
8Thiết lập cronjob
Thiết lập cronjob để chạy một lần mỗi giờ (hoặc thường xuyên tùy ý trong phạm vi hợp lý) để thực thi /usr/local/etc/bandwidth.sh. Nếu bạn đang chạy ISPConfig thì bạn có thể sử dụng nó để lên lịch cronjob.Ngoài ra, tại dòng lệnh linux, bạn có thể nhập:
Mã:
# crontab -e
Mã:
* * * * * /usr/local/ispconfig/server/server.sh 2>&1 | while read line; do echo `/bin/date` "$line" >> /var/log/ispconfig/cron.log; xong* * * * * /usr/local/ispconfig/server/cron.sh 2>&1 | while read line; do echo `/bin/date` "$line" >> /var/log/ispconfig/cron.log; xong1 * * * * /usr/local/etc/bandwidth.sh 2>&1
9Đặt PHP open_basedir
Thêm /usr/local/etc vào mục PHP open_basedir cho trang web. Trong ISPConfig, mục này nằm trong tab Tùy chọn cho Trang web.Điều này cho phép mã bandwidth.php có thể truy cập cơ sở dữ liệu SQLite mà chúng ta vừa tạo trong thư mục đó.
Chúng ta có thể bỏ qua mục này nếu quyết định tạo cơ sở dữ liệu trong thư mục đã được thiết lập là có thể truy cập, chẳng hạn như /var/www/clients/client1/web1/web/, nhưng đó sẽ là lựa chọn kém về mặt bảo mật.
10 Tạo broadband.php
Bạn cần sao chép mã này vào một tệp có tên bandwidth.php trên máy chủ của bạn trong thư mục tài liệu web cơ sở. Nếu bạn đang sử dụng ISPConfig, tệp này sẽ có dạng như /var/www/clients/client1/web1/web/
Mã:
Bandwidth Monitor - tốc độ tải xuống trong 24 giờ qua
[*] [HEADING=3]Tốc độ tải xuống - 24 giờ qua[/HEADING] var bandwidth_data = ; // trích xuất các trường chúng ta muốn lập biểu đồ từ dữ liệu JSON var bwlabels = [], bwdata = []; var mbps, bvalue; for (var i = 0; i < bandwidth_data.length ; i++){ bwlabels.push(bandwidth_data[i].timestamp); // chuyển đổi bps sang Mbps làm tròn với 3 chữ số thập phân theo định dạng cục bộ mbps = Math.round(bandwidth_data[i].download/1000).toFixed(3)/1000; bvalue = mbps.toLocaleString(undefined, { minimumFractionDigits: 3 }); bwdata.push(bvalue); } var bar_color = 'rgba(0, 128, 255, 0.9)'; var ctx = document.getElementById("myChart").getContext('2d'); var myChart = new Chart(ctx, { type: 'bar', data: { labels: bwlabels, datasets: [{ label: 'Mbps download', data: bwdata, backgroundColor: bar_color, borderColor: bar_color, borderWidth: 1 }] }, options: { // chúng ta ghi đè tooltip mặc định, tooltipItem này sẽ xóa các số 0 theo sau mặc dù chúng ta đã đặt chúng ở đó tooltips: { callbacks: { label: function(tooltipItem, data) { var value = data.datasets[0].data[tooltipItem.index]; var label = 'download: '; var retvalue = value.toLocaleString(undefined, { minimumFractionDigits: 3 }); return label + ' ' + retvalue + ' Mbps'; } } }, responsive: false, scaling: { xAxes: [{ ticks: { autoSkip: false, maxTicksLimit: 24 } }], yAxes: [{ ticks: { beginAtZero:true } }] } } });
Mã:
SELECT serverid, strftime("%H:%M", times) || " " || strftime("%d/%m/%Y", times) AS timestamp, sponsor, servername,
download
FROM broadband
WHERE serverid = 1234
ORDER BY times
LIMIT 24 OFFSET (SELECT COUNT(*)/3 FROM broadband)-24;
a. SELECT là lệnh đọc bản ghi từ bảng cơ sở dữ liệu SQL và theo sau là các trường cần đọc và các tùy chọn khác.
b. strftime("%H:%M", times) || " " || strftime("%d/%m/%Y", times) AS timestamp
là định dạng lại chuỗi ngày giờ mà speedtest đã tạo trong đầu ra CSV thành thứ gì đó thân thiện hơn với người dùng. Tôi muốn định dạng ngày theo Vương quốc Anh nên lệnh này sẽ lấy một chuỗi như "2017-08-31T12:02:51.898186Z" và biến thành "12:02 31/08/2017". Định dạng lại trực tiếp trong câu lệnh SQL sẽ đơn giản hơn là phải xử lý sau đó. Thời gian ở đây sẽ là UTC/GMT, với tôi thì ổn, nhưng bạn có thể muốn thay đổi; ví dụ: nếu bạn muốn định dạng ngày theo Hoa Kỳ thì hãy đổi phần thứ hai thành strftime("%m/%d/%Y", times).
c. serverid, timestamp, sponsor, servername, download là các trường chúng ta muốn đọc từ bảng SQL và tạo trong đối tượng JSON của mình.
d. FROM broadband là tên của bảng SQL mà chúng ta đang đọc.
e. WHERE serverid = 1234 thiết lập tập hợp con của bảng cần đọc - hãy thay đổi để khớp với serverid bạn đã sử dụng và bạn có thể muốn đọc dữ liệu cho nhiều máy chủ - nhưng điều đó sẽ làm phức tạp biểu đồ.
f. ORDER BY times thiết lập thứ tự sắp xếp của đầu ra - chúng ta muốn nó được sắp xếp theo dấu thời gian mà speedtest đặt cho mỗi lần chạy.
g. LIMIT 24 giới hạn đầu ra ở 24 bản ghi, vì chúng ta chỉ muốn hiển thị dữ liệu trong 24 giờ và vì cronjob của chúng ta được thiết lập để chạy một lần mỗi giờ. Nếu bạn chạy hai lần một giờ thì bạn sẽ cần đặt thành 48 để có được dữ liệu trong 24 giờ.
h. OFFSET (SELECT COUNT(*)/3 FROM bandwidth)-24; chúng ta muốn 24 bản ghi cuối cùng từ bảng vì chúng là các mục gần đây nhất mà chúng ta quan tâm nên chúng ta phải chỉ định OFFSET để khớp với LIMIT. Nếu không có điều này, chúng ta sẽ luôn nhận được 24 bản ghi đầu tiên trong bảng thay vì 24 bản ghi gần đây nhất. Để có được độ lệch đúng, chúng ta đếm tất cả các bản ghi trong bảng bằng (SELECT COUNT(*)) sau đó chia cho 3 (vì chúng ta đang chạy speedtest 3 lần mỗi giờ, một lần cho mỗi máy chủ khác nhau trong số 3 máy chủ khác nhau) rồi trừ 24 khỏi tổng số này để có được vị trí OFFSET đúng để LIMIT 24 sau đó sẽ nhận được các bản ghi mà chúng ta muốn.
Nếu bạn đã thay đổi tập lệnh bash để chạy thứ gì đó khác ngoài 3 bài kiểm tra máy chủ khác nhau mỗi giờ thì hãy điều chỉnh phần /3 đó cho phù hợp. Nếu bạn chỉ thử nghiệm trên một máy chủ thì không cần phải chia.
Bạn cũng có thể muốn điều chỉnh kích thước tổng thể của biểu đồ, trong đó tôi đã thực hiện theo cách dễ dàng là mã hóa cứng một kích thước phù hợp với màn hình của tôi - nó được đặt trong dòng này:
Mã:
11 Nhận bản sao cục bộ của các tệp
Tôi thích có các phiên bản cục bộ của bất kỳ tệp thư viện css và js nào (nhưng không phải phông chữ Google) cần thiết trong một trang web và nếu bạn cũng vậy thì bạn sẽ cần nhận một bản sao trên máy chủ của mình của Chart.bundle.min.js và đặt nó vào thư mục /var/www/clients/client1/web1/web/scripts trên máy chủ của bạn (hoặc bất kỳ thư mục gốc phù hợp với bạn).Bạn có thể tải tệp xuống từ: https://cdnjs.cloudflare.com/ajax/libs/Chartajs/2.6.0/Chart.bundle.min.js
Nếu bạn không muốn sử dụng bản sao cục bộ thì hãy chỉnh sửa bandwidth.php để trỏ đến phiên bản CDN công khai. Chỉ cần thay đổi dòng này:
Mã:
Mã:
12 Bật PHP trong ISPConfig
Đừng quên bật PHP trong cài đặt Trang web của bạn, nếu mục này chưa được thiết lập.13 Tải bandwidth.php trong trình duyệt
Cuối cùng chúng ta cũng hoàn thành. Sau khi tập lệnh shell bandwidth.sh chạy được vài lần để tạo một số dữ liệu (hoặc bạn có thể chạy thủ công nhiều lần lúc đầu), hãy trỏ trình duyệt của bạn đến trang web máy chủ Linux, tải bandwidth.php và bạn sẽ thấy nội dung tương tự như sau:Và đúng vậy, băng thông rộng của tôi tệ đến thế cơ mà!
Cuối cùng, đây là một vài điểm đáng lưu ý:
14 Đầu ra biểu đồ thanh
Chúng ta cần lưu ý rằng các số liệu tải xuống và tải lên được lưu trữ trong bảng SQL được tính bằng bps chứ không phải Mbps (cùng với một số chữ số thập phân khó hiểu - các số như 1533681.5922415722). Đây chỉ là cách speedtest tạo ra dữ liệu khi chạy ở chế độ CSV. Để hiển thị số liệu Mbps, thay vì bps, trên đầu ra trục y của biểu đồ thanh, có một vài dòng được bao gồm trong mã Javascript trong broadband.php để thực hiện chuyển đổi:
Mã:
mbps = Math.round(bandwidth_data[i].download/1000).toFixed(3)/1000; bvalue = mbps.toLocaleString(undefined, { minimumFractionDigits: 3 });
Cần thêm một vài dòng nữa để ghi đè cách xử lý mã di chuột mặc định là các số 0 theo sau, vì chart.js thường sẽ hiển thị "2.000" thành "2", đây không phải là điều tôi muốn, đặc biệt là sau khi đã mất công đảm bảo rằng chúng có ở đó ngay từ đầu:
Mã:
// chúng ta ghi đè chú giải công cụ mặc định, chú giải công cụ này sẽ xóa các số 0 theo sau mặc dù chúng ta đã đặt chúng ở đó chú giải công cụ: { callbacks: { label: function(tooltipItem, data) { var value = data.datasets[0].data[tooltipItem.index]; var label = 'download: '; var retvalue = value.toLocaleString(undefined, { minimumFractionDigits: 3 }); return label + ' ' + retvalue + ' Mbps'; } } },
Ngoài ra, tôi đã thiết lập các tùy chọn biểu đồ để in dấu thời gian trên trục x cho mọi thanh:
Mã:
xAxes: [{ ticks: { autoSkip: false, maxTicksLimit: 24 }
Nếu bạn muốn được trợ giúp thêm trong việc thay đổi bất kỳ tùy chọn nào của chart.js hoặc bạn không thể có được thứ mình muốn thì vui lòng kiểm tra các trang Stack Overflow của chart.js cụ thể - có rất nhiều thông tin hữu ích ở đó - https://stackoverflow.com/questions/tagged/chart.js - Chỉ cần sử dụng hộp tìm kiếm để thu hẹp những gì bạn đang tìm kiếm. Thật không may, tài liệu chart.js thiếu một số ví dụ nâng cao hơn chắc chắn sẽ rất hữu ích để bắt kịp tốc độ sử dụng đoạn mã nguồn mở tuyệt vời này.
15 Xử lý lỗi
Trong các lần chạy thử nghiệm ban đầu, tôi nhận thấy một vài lần speedtest báo cáo "Không thể truy xuất danh sách máy chủ speedtest" trong tệp CSV. Có lẽ điều này phản ánh thời điểm kết nối băng thông rộng của tôi tệ đến mức speedtest không thể kết nối với máy chủ thử nghiệm. Rõ ràng là văn bản này không ở định dạng mà chúng ta muốn nhập vào cơ sở dữ liệu SQLite nên tôi cần một giải pháp cho vấn đề này để xóa văn bản không mong muốn này khỏi tệp CSV và cũng bao gồm một mục nhập bằng không trong cơ sở dữ liệu cho khung thời gian cụ thể, nếu không, bất kỳ mục nhập nào bị thiếu trong bảng SQL sẽ đơn giản là vô hình và cũng làm mất sự liên kết mà tôi muốn có là có 24 mục nhập mỗi ngày khi tạo biểu đồ.Bạn sẽ thấy trong broadband.sh rằng tập lệnh kiểm tra mã thoát do speedtest đặt bằng cách sử dụng biến tập lệnh $? và nếu nó lớn hơn không thì điều này cho biết speedtest đã thất bại. Điều này sẽ kích hoạt hàm để tạo một mục nhập CSV giả - sau đó được sử dụng để ghi đè tệp CSV cho lần chạy đó.
Có một vài dòng trong tập lệnh bash được chú thích nhưng sẽ kiểm tra quy trình lỗi này để tạo một mục nhập số không giả nếu bạn chạy tập lệnh sau khi bỏ chú thích những dòng đó.
Mã:
################################################ trường hợp kiểm tra/gỡ lỗi - buộc speedtest không thành công################################################## runTest "1999999999"# sleep 5####### chú thích sau khi kiểm tra #########################################################
Một cách khác để buộc speedtest không thành công, cho mục đích thử nghiệm này, là xóa kết nối mạng của máy chủ. Đừng quên rằng bạn có thể chạy tập lệnh bandwidth.sh theo cách thủ công bất kỳ lúc nào, bạn không phải đợi cronjob kích hoạt nó, mặc dù bạn nên tránh chạy nó theo cách thủ công nếu cronjob sắp xảy ra. Việc chạy hai tập lệnh cùng lúc có thể làm hỏng các tệp CSV và sau đó là bảng SQL.
Nếu điều tệ nhất xảy ra thì sẽ có một tệp CSV dự phòng được lưu dưới dạng /usr/local/etc/speedtest.bak chứa tất cả đầu ra CSV từ speedtest từ lần chạy đầu tiên của tập lệnh bash trở đi. Có thể chỉnh sửa tệp này để xóa bất kỳ mục nhập không mong muốn nào, xóa bảng SQL và sau đó nhập lại toàn bộ tập hợp các mục nhập CSV vào SQLite.
16 Múi giờ
Speedtest báo cáo thời gian theo UTC (về cơ bản giống với Giờ trung bình Greenwich hoặc GMT). Sử dụng UTC có nghĩa là tất cả thời gian được lưu trữ trong bảng SQL đều nhất quán và Giờ tiết kiệm ánh sáng ban ngày sẽ không có bất kỳ tác động không mong muốn nào.Nhưng điều này có nghĩa là quy trình xử lý lỗi trong broadband.sh cần tạo dấu thời gian cho mục nhập giả để phản ánh điều này. Điều này khá đơn giản - chúng tôi chỉ cần thêm cờ --utc:
Mã:
local RIGHTNOW=$(date --utc +%Y-%m-%dT%H:%M:%SZ)
Mã:
strftime("%H:%M", time(times, 'localtime')) || " " || strftime("%d/%m/%Y", times) AS timestamp
Xem https://www.timeanddate.com/time/gmt-utc-time.html và http://www.tutorialspoint.com/sqlite/sqlite_date_time.htm để biết thêm thông tin.
17 bước và ý tưởng tiếp theo
Speedtest không nhất thiết phải là nguồn dữ liệu thô của bạn - dữ liệu có thể đến từ bất kỳ đâu và dùng cho bất kỳ mục đích gì, không chỉ là tốc độ internet. Nguyên tắc thì giống nhau - một quy trình máy chủ phụ trợ có thể lấy dữ liệu thô ở định dạng hữu ích rồi nhập vào SQLite từ một tập lệnh bash với giao diện người dùng trích xuất tập hợp con dữ liệu bạn muốn rồi lập biểu đồ.Một tập lệnh bash phức tạp hơn có thể ghi dữ liệu trực tiếp vào bảng SQL (sử dụng lệnh SQL INSERT) nếu định dạng dưới dạng CSV không phải là một tùy chọn. Khi bạn thiết kế bảng SQL, hãy nghĩ về cách bạn có thể muốn trích xuất dữ liệu sau đó.
Khi thực hiện bất kỳ thay đổi nào, hãy ghi nhớ ngữ cảnh của mã bạn đang chỉnh sửa; tức là chúng ta có các câu lệnh SQL bên trong tập lệnh PHP bên trong Javascript bên trong HTML. Hãy nhớ cấp độ bạn đang ở và mã hóa cho phù hợp. Bạn có thể dễ dàng mất dấu và kết thúc bằng việc viết mã PHP bằng thứ lẽ ra phải là Javascript! Tôi đảm bảo điều này sẽ không hiệu quả.
Sau đây là một số ý tưởng để khám phá thêm:
- toLocaleString không được triển khai nhất quán trên các trình duyệt. Sử dụng Globalize và xử lý tất cả các định dạng số, ngày và múi giờ bằng nó.
- Kiểm tra httpstat (có phiên bản tập lệnh bash) cho phép thu thập các loại dữ liệu kết nối internet khác nhau. Lưu trữ dữ liệu này trong một bảng SQL (riêng) và biểu đồ đầu ra.
- Cải thiện giao diện người dùng bandwidth.php để cung cấp cho người dùng nhiều tùy chọn khác nhau: 24, 48, 72 giờ; chọn một ngày cụ thể, bao gồm dữ liệu tải lên và tải xuống, thời gian ping.
- Chuyển đổi HTML để sử dụng mã Bootstrap phản hồi để chạy tốt trên các thiết bị hoặc kích thước màn hình khác nhau.
- Khám phá một số tùy chọn khác của chart.js; có thể là biểu đồ đường và biểu đồ thanh kết hợp; thay đổi màu sắc và kích thước thanh.
- thay thế SQLite bằng MySQL và tăng cường bảo mật với quyền truy cập đọc từ PHP thông qua người dùng/mật khẩu.
- Xây dựng một hệ thống tương tự nhưng sử dụng node.js.
18 Liên kết
- speedtest: https://github.com/sivel/speedtest-cli
- SQLite3: https://sqlite.org/
- chart.js: http://www.chartjs.org/
- Toàn cầu hóa: 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/