리눅스, 스피드테스트, 데이터베이스 · 16 min read · Nov 11, 2025
리눅스 서버에서 스피드테스트를 사용하여 인터넷 속도를 그래픽으로 확인, 저장 및 보고하는 방법
연결이 불안정한 문제를 겪으면서, 나는 제공업체로부터 얻는 Mbps 속도를 정기적으로 모니터링하고 싶다고 결심했다. 특히 저녁에 파일을 다운로드할 때 매우 낮은 수치를 보았고, 이른 아침에는 훨씬 더 빠른 속도를 기록했다.
나는 ISPConfig에서 호스팅된 웹사이트를 위한 테스트 및 개발 머신으로 사용되는 리눅스 데비안 서버를 한쪽 구석에 두고 있다. 그래서 나는 리눅스 명령줄에서 실행할 수 있는 대역폭 테스트를 가능하게 하는 소프트웨어를 찾았고, 이는 내가 필요로 하는 원시 데이터를 생성하기 위한 자동화된 셸 스크립트 시스템의 기초가 될 수 있었다. 나는 SQL 데이터베이스에 데이터를 저장하여 쿼리를 간단하게 만들고 (그렇게 하면 더 많은 데이터를 쉽게 수집하고 내가 관심 있는 시간대의 작은 하위 집합만 추출할 수 있다) 데이터를 시각화하고 연결 문제를 강조하는 간단한 차트를 생성할 수 있는 웹 프론트 엔드를 갖고 싶었다.
내 검색의 첫 번째 결과는 Antonio Valencia의 매우 유용한 기사였다: https://www.howtoforge.com/tutorial/check-internet-speed-with-speedtest-cli-on-ubuntu/
거기에서 스피드테스트를 설치하는 지침을 따랐고, 빠른 테스트를 통해 다양한 인터넷 서버에 대해 테스트를 실행하고 CSV 형식으로 출력을 생성할 수 있다는 것을 알게 되었다. 이는 소프트웨어 개발에서 최소한의 노력으로 SQL 테이블에 직접 가져오기 적합하다.
상대적으로 적은 양의 데이터가 생성될 것이기 때문에 나는 백엔드 저장소로 SQLite를 사용하기로 결정했고, 사용 가능한 오픈 소스 자바스크립트 기반 그래프 라이브러리를 빠르게 검색한 결과 chart.js를 발견했다. 이 라이브러리는 간단하고 깔끔한 디자인과 간단한 데이터 인터페이스를 제공하지만 필요할 경우 고급 옵션을 조정할 수 있는 충분한 기능을 갖추고 있다. SQL 데이터를 변환하여 내가 그래프화하고자 하는 데이터의 하위 집합만 추출하고 JSON을 통해 출력하는 간단한 PHP 코드를 사용하는 것이 좋았다.
그래서 전반적으로 나는 다음과 같은 시스템을 설계해야 했다:
스피드테스트를 크론잡으로 실행하는 리눅스 서버 - 아마도 시간당 1회 - 스피드테스트 출력이 SQLite 데이터베이스에 저장되고, 모든 것이 bash 셸 스크립트 파일에 의해 제어된다. SQLite에서 데이터를 추출하고 지난 24시간(또는 내가 결정할 수 있는 다른 기간)에 대한 Mbps 수치를 보여주는 막대 차트를 생성하는 HTML, CSS, 자바스크립트 및 PHP의 혼합으로 구성된 웹 프론트 엔드.
스피드테스트를 대화형으로 10회 정도 실행해본 결과, 내가 경험하고 있는 속도와 밀접하게 일치하는 결과를 제공하는 몇몇 서버가 있다는 것을 알게 되었다. 나는 목표 서버의 위치와 다른 시간대의 시간에 따라 내 Mbps 수치가 어떻게 영향을 받는지 더 잘 이해하기 위해 여러 서버를 테스트하는 것이 좋다고 생각했다.
비슷한 시스템을 설정하고 싶다면, 스피드테스트에서 사용할 수 있는 수백 개의 서버 중에서 하나 이상의 서버를 선택해야 한다.
1 필수 조건
- 리눅스 서버 - 나는 Debian 9.1 - stretch를 사용하고 있다.
- 루트 로그인으로 서버에 tty 접근 가능 - 나는 Windows 노트북에서 PuTTY를 사용한다.
- ISPConfig가 설치되어 있고 FTP 계정이 구성된 웹사이트 - 나는 apache가 웹 서버로 설정된 3.1.6을 사용하고 있다 (다음 지침에 몇 가지 사소한 변경을 통해 웹 서버만으로도 관리할 수 있다).
- PHP - 나는 7.0을 사용하고 있지만 대부분의 이전 버전에서도 작동해야 한다.
- FTP 클라이언트 - 나는 Filezilla를 사용하고 있으며, 서버에서 PureFTPd가 실행되고 있다.
- nano - 또는 당신이 좋아하는 비주얼 편집기
여기서는 리눅스 서버에 로그인하는 것, 디렉토리를 탐색하는 방법, 웹 서버가 파일이 있을 것으로 예상하는 레이아웃, 그리고 FTP 파일을 해당 디렉토리에 전송하는 방법에 익숙하다고 가정하고 있다.
다음은 이를 설정할 수 있도록 하는 자세한 단계이다.
2 스피드테스트 설치
루트로 리눅스 서버에 로그인하고 다음 명령을 실행한다:
# pip install speedtest-cli문제가 있는 경우 추가 정보는 https://www.howtoforge.com/tutorial/check-internet-speed-with-speedtest-cli-on-ubuntu/ 및 https://pypi.python.org/pypi/speedtest-cli를 참조하라.
참고: 내 설치에서 speedtest와 speedtest-cli는 동일하므로 다음에서는 speedtest만 언급하겠다.
3 SQLite3 설치
# apt-get install sqlite3apt-get이 아닌 경우에는 배포판에 맞는 명령을 사용하라.
4 bandwidth.sh 생성
다음 bash 스크립트 코드를 파일에 입력하고 /usr/local/etc/bandwidth.sh로 저장하라. 나중에 이를 당신에게 맞게 수정할 것이다.
#!/bin/bash
# 3개의 서버에 대해 스피드테스트를 실행하고 모든 출력 결과를 CSV 파일에 저장하여 sqlite db로 가져온다.
#
# 매시간 크론잡에 의해 실행된다.
#
#
function getCSVString () {
# 스피드테스트가 실패한 경우 (예: 서버에 접근할 수 없었던 경우) 이 시간 슬롯에 대한 더미 제로 항목을 생성해야 한다.
# 스피드테스트가 생성하는 것과 동일한 형식의 타임스탬프 문자열을 가져온다 - UTC 시간이 필요하다.
local RIGHTNOW=$(date --utc +%Y-%m-%dT%H:%M:%SZ)
# 어떤 서버에 대해 테스트하고 있는가?
if [ $1 = "5443" ]
then
echo "5443,Fasthosts Internet,Gloucester,$RIGHTNOW,73.09,0.0,0.0,0.0"
fi
if [ $1 = "1234" ]
then
echo "1234,Uno,Milton Keynes,$RIGHTNOW,168.27,0.0,0.0,0.0"
fi
if [ $1 = "1783" ]
then
echo "1783,Comcast,\"San Francisco, CA\",$RIGHTNOW,8420.0,0.0,0.0,0.0"
fi
# 테스트/디버그 케이스 전용
if [ $1 = "199999999" ]
then
echo "99999,Test,Test,$RIGHTNOW,99.99,0.0,0.0,0.0"
fi
}
function runTest () {
# CSV 출력을 tmp 파일에 저장하여 명명된 서버에 대해 스피드테스트를 실행한다.
/usr/local/bin/speedtest --csv --server $1 > /usr/local/etc/speedtest.tmp
if [ $? -gt 0 ]
then
# 스피드테스트가 실패했으므로 오류 메시지 대신 제로 항목을 생성한다.
getCSVString $1 > /usr/local/etc/speedtest.tmp
fi
# 다음 서버 테스트를 위해 출력을 저장한다.
cat /usr/local/etc/speedtest.tmp >> /usr/local/etc/speedtest.csv
}
# 메인
#######
# 3개의 서버에 대해 스피드테스트를 실행하고 모든 출력 결과를 CSV 파일에 저장한다.
cd /usr/local/etc
# CSV 파일을 지운다 - 실행 시작 시 비어 있어야 한다.
rm -f /usr/local/etc/speedtest.csv
############################################
# 테스트/디버그 케이스 - 스피드테스트를 실패하게 만든다.
############################################
# runTest "199999999"
# sleep 5
####### 테스트 후 주석 처리 ##########
############################################
runTest "5443"
sleep 10
runTest "1234"
sleep 10
runTest "1783"
sleep 1
# 이제 CSV 데이터를 sqlite db로 가져온다.
sqlite3 -batch /usr/local/etc/bandwidth.db <<"EOF"
.separator ","
.import /usr/local/etc/speedtest.csv bandwidth
EOF
# 현재 실행 CSV를 백업에 추가한다.
cat /usr/local/etc/speedtest.csv >> /usr/local/etc/speedtest.bak파일 속성을 설정하여 이 스크립트를 실행 가능하게 만든다:
# chmod 0700 bandwidth.sh5 SQLite 데이터베이스 생성
/usr/local/etc에 bandwidth.db SQLite 데이터베이스를 생성한다:
#sqlite3 bandwidth.db그런 다음 sqlite> 프롬프트에서 다음 명령으로 새 테이블을 생성한다 (마지막 세미콜론을 놓치지 말라):
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 );sqlite> .quit이것은 스피드테스트의 CSV 형식 출력에 직접 매핑되는 필드를 가진 bandwidth라는 테이블을 생성한다.
6 서버 목록 가져오기
스피드테스트가 사용하는 서버 목록이 필요하다.
# speedtest --list > servers.txt이제 servers.txt를 확인하여 테스트를 실행할 서버의 숫자 ID를 찾는다.
# nano servers.txt파일은 다음과 비슷하게 보일 것이다:
스피드테스트.net 구성 검색 중...
5833) Hub Network Services Ltd (Newport, Wales) [57.50 km]
5938) Spectrum Internet (Cardiff, Great Britain) [65.89 km]
5443) Fasthosts Internet (Gloucester, Great Britain) [74.31 km]
6504) Secure Web Services Ltd (Shrewsbury, Great Britain) [78.64 km]
7265) Unitron Systems & Development Ltd (Telford, Great Britain) [87.11 km]
8225) Exascale Limited (Wolverhampton, Great Britain) [96.08 km]
3110) zero.net.uk Ltd (Studley, Great Britain) [96.12 km]
12401) Dragon WiFi LTD (Haverfordwest, United Kingdom) [120.78 km]
1153) Warwicknet Ltd. (Coventry, Great Britain) [125.18 km]
1685) Vodafone UK (Newbury, Great Britain) [153.25 km]
4384) Iomart (Leicester, Great Britain) [157.40 km]
1234) Uno (Milton Keynes, Great Britain) [170.71 km]
3504) TNP Ltd. (Manchester, Great Britain) [170.93 km]
11747) Vispa (Manchester, United Kingdom) [170.93 km]서버 ID는 왼쪽에 있다. 각 줄의 끝에 있는 숫자는 스피드테스트가 서버와의 거리(킬로미터 단위)를 추정한 것이다. 이는 정확하지 않을 수 있으며 실행마다 변경될 수 있다. 테스트 서버는 이 거리에 따라 정렬되어 있으며, 가장 가까운 서버부터 시작한다. 이 목록의 상단에 있는 서버를 테스트하면 이론적으로 가장 빠른 핑과 최고의 다운로드 및 업로드 속도를 제공할 수 있다.
7 서버 ID 선택 및 bandwidth.sh 수정
이제 다양한 서버 ID에 대해 스피드테스트를 수동으로 실행하여 어떤 결과를 얻는지 확인할 시간이다. 나는 영국에서 나와 가까운 두 개의 서버와 비교를 위해 캘리포니아의 한 서버를 선택했다. 사용할 명령의 형식은 다음과 같다:
# speedtest --server 1234보는 출력은 다음과 비슷할 것이다:
스피드테스트.net 구성 검색 중...
xxxxxxx(n.n.n.n)에서 테스트 중...
스피드테스트.net 서버 목록 검색 중...
핑을 기준으로 최적의 서버 선택...
Uno (Milton Keynes)에서 호스팅 [187.87 km]: 33.243 ms
다운로드 속도 테스트................................................................................
다운로드: 1.60 Mbit/s
업로드 속도 테스트...............................................................................................
업로드: 0.55 Mbit/s사용할 서버를 선택한 후, 숫자 서버 ID를 bandwidth.sh의 관련 줄에 넣는다. 나는 3개의 서버를 사용했지만 원한다면 이를 변경할 수 있다.
runTest "5443"
sleep 10
runTest "1234"
sleep 10
runTest "1783"
sleep 1또한 스피드테스트가 특정 실행에서 실패할 경우 더미 항목을 생성하는 오류 루틴의 코드를 조정해야 한다.
# 어떤 서버에 대해 테스트하고 있는가?
if [ $1 = "5443" ]
then
echo "5443,Fasthosts Internet,Gloucester,$RIGHTNOW,73.09,0.0,0.0,0.0"
fi
if [ $1 = "1234" ]
then
echo "1234,Uno,Milton Keynes,$RIGHTNOW,168.27,0.0,0.0,0.0"
fi
if [ $1 = "1783" ]
then
echo "1783,Comcast,\"San Francisco, CA\",$RIGHTNOW,8420.0,0.0,0.0,0.0"
fi여기서 $RIGHTNOW 뒤의 숫자(예: 73.09)는 해당 서버까지의 거리(킬로미터 단위)이다. 나는 이를 어디에서도 사용하지 않으므로 자리 표시자일 뿐이며, 어떤 숫자 값이든 될 수 있다.
1783 예제에서는 위치에 쉼표가 포함되어 있으므로 따옴표를 넣고 이스케이프해야 CSV 파일에 포함될 수 있다. 이스케이프된 따옴표가 없으면 쉼표가 CSV 필드 구분자로 처리되어 SQLite 가져오기에서 문제가 발생할 수 있다. 선택한 서버에 유사한 위치 텍스트가 쉼표를 포함하고 있다면 이스케이프된 따옴표를 사용해야 한다.
8 크론잡 설정
/usr/local/etc/bandwidth.sh를 실행하기 위해 매시간(또는 합리적인 범위 내에서 원하는 만큼 자주) 크론잡을 설정한다. ISPConfig를 실행 중이라면 이를 사용하여 크론잡을 예약할 수 있다.

대안으로 리눅스 명령줄에서 다음을 입력할 수 있다:
# crontab -e다음과 비슷한 내용을 볼 수 있어야 한다(기억하라, 당신은 ‘root’로 로그인하고 있다):
* * * * * /usr/local/ispconfig/server/server.sh 2>&1 | while read line; do echo `/bin/date` "$line" >> /var/log/ispconfig/cron.log; done
* * * * * /usr/local/ispconfig/server/cron.sh 2>&1 | while read line; do echo `/bin/date` "$line" >> /var/log/ispconfig/cron.log; done
1 * * * * /usr/local/etc/bandwidth.sh 2>&1ISPConfig를 실행하지 않는 경우 처음에는 비어 있을 수 있다. 위와 같이 마지막 줄을 정확히 추가하라 - 공백이 중요하다 - 00:01 AM에 셸 스크립트를 실행하고 매시간 반복하도록 설정한다. 물론 다른 시간도 선택할 수 있다. (처음 실행할 때 crontab은 사용할 편집기를 묻는다 - 나는 nano를 선택한다.)
9 PHP open_basedir 설정
웹사이트의 PHP open_basedir 항목에 /usr/local/etc를 추가한다. ISPConfig에서는 웹사이트의 옵션 탭에서 찾을 수 있다.

이렇게 하면 방금 생성한 SQLite 데이터베이스에 bandwidth.php 코드가 접근할 수 있다.
우리는 이미 접근 가능한 디렉토리(예: /var/www/clients/client1/web1/web/)에 데이터베이스를 생성하기로 결정했다면 이 단계를 건너뛸 수 있었다. 하지만 이는 보안 관점에서 좋지 않은 선택이다.
10 bandwidth.php 생성
이 코드를 서버의 기본 웹 문서 디렉토리에 bandwidth.php라는 파일로 복사해야 한다. ISPConfig를 사용하는 경우 /var/www/clients/client1/web1/web/와 같은 경로가 될 것이다.
대역폭 모니터 - 지난 24시간의 다운로드 속도
다운로드 속도 - 지난 24시간
이 파일을 수정하여 보고할 서버 ID를 사용해야 한다. 나는 이 예제에서 서버 1234를 사용하고 있다. 며칠간의 데이터를 탐색한 결과, 이 서버가 내가 느끼는 속도와 가장 밀접하게 일치하는 Mbps 수치를 생성하고 있었다. 서버 ID는 SQL SELECT 문에서 WHERE 절에 있다:
SELECT serverid, strftime("%H:%M", times) || " " || strftime("%d/%m/%Y", times) AS timestamp, sponsor, servername,
download
FROM bandwidth
WHERE serverid = 1234
ORDER BY times
LIMIT 24 OFFSET (SELECT COUNT(*)/3 FROM bandwidth)-24;이 SQL 문은 정확히 무엇을 하고 있는가? SQL에 익숙하지 않다면 각 부분을 살펴보자.
a. SELECT는 SQL 데이터베이스 테이블에서 레코드를 읽기 위한 명령이며, 읽을 필드와 기타 옵션이 뒤따른다.
b. strftime(“%H:%M”, times) || “ “ || strftime(“%d/%m/%Y”, times) AS timestamp는 스피드테스트가 CSV 출력에서 생성한 날짜 및 시간 문자열을 좀 더 사용자 친화적인 형식으로 재구성하는 것이다. 나는 영국 형식의 날짜를 원하므로, “2017-08-31T12:02:51.898186Z”와 같은 문자열을 “12:02 31/08/2017”로 변환한다. 이 재구성은 나중에 처리하는 것보다 SQL 문에서 직접 하는 것이 더 간단하다. 여기서의 시간은 UTC/GMT가 될 것이므로 나에게는 괜찮지만, 만약 미국 형식의 날짜를 원한다면 두 번째 부분을 strftime(“%m/%d/%Y”, times)로 변경하면 된다.
c. serverid, timestamp, sponsor, servername, download는 SQL 테이블에서 읽고 JSON 객체를 생성하고자 하는 필드들이다.
d. FROM bandwidth는 우리가 읽고 있는 SQL 테이블의 이름이다.
e. WHERE serverid = 1234는 읽을 테이블의 하위 집합을 설정한다 - 사용한 serverid와 일치하도록 변경해야 하며, 여러 서버의 데이터를 읽고 싶다면 - 하지만 이는 차트를 복잡하게 만들 것이다.
f. ORDER BY times는 출력의 정렬 순서를 설정한다 - 우리는 스피드테스트가 각 실행에 대해 설정한 타임스탬프에 따라 정렬되기를 원한다.
g. LIMIT 24는 출력을 24개의 레코드로 제한한다. 우리는 24시간 분량의 데이터만 표시하고 싶고, 크론잡이 매시간 실행되도록 설정되어 있기 때문이다. 만약 한 시간에 두 번 실행하고 있다면, 24시간의 데이터를 얻기 위해서는 이를 48로 설정해야 한다.
h. OFFSET (SELECT COUNT()/3 FROM bandwidth)-24; 우리는 가장 최근의 24개의 레코드를 원하므로 LIMIT과 일치하도록 OFFSET을 지정해야 한다. 이를 위해 테이블의 모든 레코드를 COUNT()로 세고, 이를 3으로 나눈 다음, 이 총계에서 24를 빼서 올바른 OFFSET 위치를 얻는다. 그러면 LIMIT 24가 우리가 원하는 레코드를 가져올 수 있다. 만약 bash 스크립트를 변경하여 시간당 3개의 서로 다른 서버 테스트가 아닌 다른 것을 실행하도록 했다면, 그 /3 부분을 적절히 조정해야 한다. 만약 단일 서버에 대해서만 테스트하고 있다면 나눗셈은 필요하지 않다.
차트의 전체 크기도 조정하고 싶을 수 있다. 나는 내 화면에 적합한 크기로 하드 코딩한 간단한 방법을 사용했다. 이는 다음 줄에 설정되어 있다:
11 파일의 로컬 복사본 가져오기
나는 필요한 모든 css 및 js 라이브러리 파일의 로컬 버전을 갖는 것을 선호한다(구글 폰트는 제외) 그리고 당신도 그렇다면, 서버의 /var/www/clients/client1/web1/web/scripts 디렉토리에 Chart.bundle.min.js의 복사본을 가져와야 한다(또는 당신에게 적합한 기본 디렉토리).
다음 링크에서 파일을 다운로드할 수 있다: https://cdnjs.cloudflare.com/ajax/libs/Chartajs/2.6.0/Chart.bundle.min.js
로컬 복사를 사용하고 싶지 않다면 bandwidth.php를 수정하여 공개 CDN 버전을 가리키도록 변경하라. 다음 줄을 변경하면 된다:
다음과 같이:
12 ISPConfig에서 PHP 활성화
웹사이트 설정에서 PHP를 활성화하는 것을 잊지 마라. 이미 설정되어 있지 않다면.

13 브라우저에서 bandwidth.php 로드
우리는 마침내 끝났다. bandwidth.sh 셸 스크립트가 데이터를 생성하기 위해 몇 번 실행될 시간을 주거나, 처음에 여러 번 수동으로 실행한 후, 브라우저를 리눅스 서버 웹사이트로 가리키고 bandwidth.php를 로드하면 다음과 같은 화면을 볼 수 있다:

그리고 예, 내 브로드밴드는 정말 그렇게 나쁘다!
마지막으로 다루어야 할 몇 가지 추가 사항이 있다:
14 막대 차트 출력
SQL 테이블에 저장된 다운로드 및 업로드 수치는 Mbps가 아닌 bps로 되어 있다(그리고 혼란스러운 많은 소수 자릿수 - 1533681.5922415722와 같은 숫자들). 이는 스피드테스트가 CSV 모드에서 실행될 때 데이터를 생성하는 방식이다. 막대 차트의 y축 출력에서 bps 대신 Mbps 수치를 표시하기 위해 bandwidth.php의 자바스크립트 코드에 몇 줄이 포함되어 있다:
mbps = Math.round(bandwidth_data[i].download/1000).toFixed(3)/1000;
bvalue = mbps.toLocaleString(undefined, { minimumFractionDigits: 3 });toLocaleString을 사용하면 브라우저의 로케일 설정에 따라 올바른 소수점 구분 기호(“.” 또는 “,”)가 삽입되어야 하지만, 이는 구현에 따라 다르며 다소 일관성이 없다. 만약 당신이 . 대신 ,가 보이고 그것이 불편하다면 Globalize가 이를 수정하는 방법이다. 아래의 ‘18 추가 단계 및 아이디어’를 참조하라.
후행 0을 처리하는 기본 호버 코드의 동작을 재정의하기 위해 몇 줄이 더 필요하다. chart.js는 일반적으로 “2.000”을 “2”로 표시하는데, 이는 내가 처음에 그렇게 하도록 노력했기 때문에 원하지 않는다:
// 기본 툴팁이 후행 0을 제거하는 것을 재정의한다.
tooltips: {
callbacks: {
label: function(tooltipItem, data) {
var value = data.datasets[0].data[tooltipItem.index];
var label = '다운로드: ';
var retvalue = value.toLocaleString(undefined, { minimumFractionDigits: 3 });
return label + ' ' + retvalue + ' Mbps';
}
}
},이는 chart.js의 동작 방식을 ‘드릴다운’하여 변경하는 좋은 예이다.
또한 x축에 모든 막대의 타임스탬프를 인쇄하도록 차트 옵션을 설정했다:
xAxes: [{
ticks: {
autoSkip: false,
maxTicksLimit: 24
}
}],기본 옵션(자동 건너뛰기가 true로 설정된 경우)은 레이블에 몇 가지 이상한 간격을 초래했다. 24개 항목 이외의 항목을 표시하려면 maxTicksLimit를 변경해야 한다.
차트.js 옵션을 변경하는 데 더 도움이 필요하다면, 원하는 것이 작동하지 않는 경우 chart.js Stack Overflow 페이지를 확인하라. 유용한 정보가 많이 있다 - https://stackoverflow.com/questions/tagged/chart.js - 검색 상자를 사용하여 원하는 내용을 좁힐 수 있다. 불행히도 chart.js 문서는 고급 예제가 부족하여 이 훌륭한 오픈 소스 코드를 사용하는 데 큰 도움이 될 것이다.
15 오류 처리
초기 테스트 실행 중에, 나는 몇 번 스피드테스트가 CSV 파일에서 “스피드테스트 서버 목록을 검색할 수 없습니다”라고 보고하는 것을 보았다. 아마도 이는 내 브로드밴드 연결이 너무 나빠서 스피드테스트가 테스트 서버에 연결할 수 없었던 경우를 반영한 것이다. 이 텍스트는 SQLite 데이터베이스에 가져오고자 하는 형식이 아니므로, CSV 파일에서 이 원하지 않는 텍스트를 삭제하고 특정 시간 슬롯에 대한 제로 항목을 포함하는 솔루션이 필요했다. 그렇지 않으면 SQL 테이블의 누락된 항목은 단순히 보이지 않게 되고, 차트를 생성할 때 24개의 항목을 정렬하는 데 원하는 정렬을 방해할 것이다.
bandwidth.sh에서 스크립트는 스피드테스트가 설정한 종료 코드를 테스트하고, 0보다 크면 스피드테스트가 실패했음을 나타낸다. 이는 더미 CSV 항목을 생성하는 함수를 트리거한다 - 이는 해당 실행에 대한 CSV 파일을 덮어쓰는 데 사용된다.
테스트 목적으로 스피드테스트를 실패하게 만드는 몇 줄이 bandwidth.sh에 주석 처리되어 있지만, 이 오류 루틴을 테스트하여 더미 제로 항목을 생성할 수 있다.
############################################
# 테스트/디버그 케이스 - 스피드테스트를 실패하게 만든다.
############################################
# runTest "199999999"
# sleep 5
####### 테스트 후 주석 처리 ##########
############################################이는 스피드테스트가 좋아하지 않는 ‘무의미한‘ 서버 ID를 사용하여 비제로 종료 코드를 반환하게 하여, 스크립트가 더미 항목을 생성하도록 한다. 이는 SQL 테이블에 행복하게 앉아 있을 수 있으며 무시되거나 삭제할 수 있다.
스피드테스트를 실패하게 만드는 또 다른 방법은 서버의 네트워크 연결을 제거하는 것이다. 언제든지 bandwidth.sh 스크립트를 수동으로 실행할 수 있다는 것을 잊지 마라. 크론잡이 실행되기를 기다릴 필요는 없다. 하지만 크론잡이 임박해 있을 경우 수동으로 실행하는 것은 피해야 한다. 두 개의 스크립트가 동시에 실행되면 CSV 파일과 SQL 테이블이 엉망이 될 가능성이 높다.
최악의 경우, /usr/local/etc/speedtest.bak에 백업 CSV 파일이 유지되며, 이는 스피드테스트의 모든 CSV 출력을 첫 번째 실행부터 포함하고 있다. 이는 원하지 않는 항목을 제거하기 위해 편집할 수 있으며, SQL 테이블을 지우고 전체 CSV 항목 세트를 SQLite에 다시 가져올 수 있다.
16 시간대
스피드테스트는 UTC로 시간을 보고한다(기본적으로 이는 그리니치 평균시 또는 GMT와 동일하다). UTC를 사용하면 SQL 테이블에 저장된 모든 시간이 일관되며, 일광 절약 시간이 원하지 않는 영향을 미치지 않는다.
하지만 이는 bandwidth.sh의 오류 처리 루틴이 더미 항목의 타임스탬프를 반영하도록 생성해야 함을 의미한다. 이는 꽤 간단하다 - 우리는 –utc 플래그를 포함하기만 하면 된다:
local RIGHTNOW=$(date --utc +%Y-%m-%dT%H:%M:%SZ)그래프 x축 레이블이 UTC/GMT 이외의 시간으로 표시되기를 원한다면, 가장 좋은 곳은 SQL SELECT 문에서 변경하는 것이다. 예를 들어:
strftime("%H:%M", time(times, 'localtime')) || " " || strftime("%d/%m/%Y", times) AS timestamp이는 리눅스 서버의 시간대 설정을 사용하여 차트에 표시되는 시간을 조정한다. 또는 Globalize가 프론트 엔드에서 이를 수행하는 방법을 알아낼 수 있다.
자세한 내용은 https://www.timeanddate.com/time/gmt-utc-time.html 및 http://www.tutorialspoint.com/sqlite/sqlite_date_time.htm를 참조하라.
17 추가 단계 및 아이디어
스피드테스트는 원시 데이터의 출처일 필요는 없다 - 어디서든지 올 수 있으며, 인터넷 속도뿐만 아니라 무엇이든 될 수 있다. 원리는 동일하다 - 유용한 형식으로 원시 데이터를 가져올 수 있는 백엔드 서버 프로세스와 bash 스크립트를 통해 SQLite로 가져오는 프로세스, 원하는 데이터의 하위 집합을 추출하고 이를 차트화하는 프론트 엔드.
보다 복잡한 bash 스크립트는 CSV 형식이 아닌 경우 SQL 테이블에 직접 데이터를 쓸 수 있다(SQL INSERT 명령 사용). SQL 테이블을 설계할 때 나중에 데이터를 어떻게 추출할지 고려하라.
변경을 할 때는 편집 중인 코드의 맥락을 염두에 두어야 한다. 즉, 우리는 PHP 스크립트 내의 SQL 문을 HTML 내의 자바스크립트 내에 두고 있다. 당신이 있는 수준을 기억하고 그에 맞게 코딩하라. PHP 코드를 자바스크립트로 작성하는 것은 쉽고도 불가능하다! 나는 이것이 작동하지 않을 것이라고 보장할 수 있다.
다음은 추가 탐색을 위한 몇 가지 아이디어이다:
- toLocaleString은 브라우저마다 일관되게 구현되지 않는다. Globalize를 사용하여 모든 숫자, 날짜 및 시간대 형식을 처리하라.
- 다양한 유형의 인터넷 연결 데이터를 수집할 수 있는 httpstat(배쉬 스크립트 버전도 있음)를 확인하라. 이를 별도의 SQL 테이블에 저장하고 출력을 그래프로 표시하라.
- bandwidth.php 프론트 엔드를 개선하여 사용자에게 다양한 옵션 선택을 제공하라: 24, 48, 72시간; 특정 날짜 선택, 업로드 및 다운로드 데이터 포함, 핑 시간.
- HTML을 반응형 Bootstrap 코드로 변환하여 다양한 장치나 화면 크기에서 잘 실행되도록 하라.
- chart.js의 다른 옵션을 탐색하라; 아마도 결합된 선 및 막대 차트; 색상 및 막대 크기 변경.
- SQLite를 MySQL로 교체하고 PHP를 통해 사용자/비밀번호로 읽기 접근을 추가하라.
- node.js를 사용하여 유사한 시스템을 구축하라.
18 링크
- 스피드테스트: https://github.com/sivel/speedtest-cli
- SQLite3: https://sqlite.org/
- chart.js: http://www.chartjs.org/
- Globalize: 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/
새 게시물을 받은 편지함에서 받기
스팸은 없습니다. 언제든지 구독 해지 가능합니다.