🌐

nuro光のパケットロス測定

2022/11/28に公開

概要

自宅のPCから1時間に一回pingとrsyncをしてpacket lossや転送速度を計測した時のメモ

期間は10月1日 ~ 11月26日

環境は以下の通り

  • NURO
    • プラン: NURO光G2T (戸建)
    • ルーター: F660A
    • 地域: 神奈川
  • 自宅PC
    • OS: Debian 11
    • IPv6アドレスについてはIPv6PrivacyExtensionsを有効にしていて24時間毎にアドレスが切り替わる設定
  • oracle cloud
    • tracerouteは15ホップくらい
  • webarena indigo
    • ipv4/ipv6のデュアルスタック
    • ipv4/ipv6のファイヤーウォールはnftablesで個別に許可
    • tracerouteは11ホップくらい

pingについては各ホストにpingコマンドを実行するだけ

rsyncについては
dd if=/dev/urandom of=rand.dat bs=1MB count=10
で作ったファイルをrsyncで落とすだけ

計測で得られたデータ
https://gist.github.com/0ec52ceca7bc2ccd3cb7ccfb41317761

※注意
自宅もサーバーも回線も他の用途で使っているため負荷が高い場合もあります
測定元PCは1台なので、こちらがパケットロスの原因がこちらにある可能性もあります
そのためこの結果だけでNURO光の回線品質を論ずることはできません
あと計測も簡易的なものなので、誤差が多分に含まれています
あくまで参考程度にお願いします

以下posit.cloudでグラフを描きます

パケットロスについて

library(dplyr)
ping <- read.csv(header = T, "ping.csv")

通信先ホスト

なぜかパケットロスはIPv6が殆どでした

group_by_host = ping |>
  group_by(host) |>
  summarise(loss_avg = mean(loss))
barplot(
  group_by_host$loss_avg,
  names.arg = group_by_host$host,
  xlab = "host",
  ylab = "loss_avg",
  ylim = c(0,2),
)
> group_by_host
# A tibble: 4 × 2
  host          loss_avg
  <chr>            <dbl>
1 ORACLE1_IPV4    0.0219
2 ORACLE2_IPV4    0.0439
3 WEBARENA_IPV4   0.410 
4 WEBARENA_IPV6   1.90  

時間帯

深夜23時と朝8時がパケットロスが高い傾向がありますが、バッチ処理とよくネット使うのがその時間なのでそのせいかも

ping$hour <-
  format.POSIXct(as.POSIXct(ping$time, origin = "1970-01-01"), "%H")
result <- group_by(ping, hour) |>
  summarise(loss_avg = mean(loss))
barplot(
  result$loss_avg,
  names.arg = result$hour,
  xlab = "hour",
  ylab = "loss_avg"
)

日付

日付ごとのパケットロス推移
全体で見るとあまり変わってないように思えます

ping$day <-
  as.integer((ping$time - 1664565638) / 60 / 60 / 24) # 計測開始日を0として経過日数
result <-
  group_by(ping, day) |>
  summarise(loss_avg = mean(loss))
plot(result$day, result$loss_avg)
linear_model <- lm(result$loss_avg ~ result$day)
abline(linear_model)
summary(linear_model)

> summary(linear_model)

Call:
lm(formula = result$loss_avg ~ result$day)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.60857 -0.27672  0.01213  0.15285  0.77498 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  0.6143019  0.0885485   6.937 4.78e-09 ***
result$day  -0.0007167  0.0027266  -0.263    0.794    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.3387 on 55 degrees of freedom
Multiple R-squared:  0.001255,	Adjusted R-squared:  -0.0169 
F-statistic: 0.06909 on 1 and 55 DF,  p-value: 0.7936

WEBARENA_IPV6に限定すると減少傾向に見えるような気もしますが
あんま有意じゃなさそう

ping$day <-
  as.integer((ping$time - 1664565638) / 60 / 60 / 24) # 計測開始日を0として経過日数
result <- filter(ping, host == "WEBARENA_IPV6") |>
  group_by(day) |>
  summarise(loss_avg = mean(loss))
plot(result$day, result$loss_avg)
linear_model <- lm(result$loss_avg ~ result$day)
abline(linear_model)
summary(linear_model)

> summary(linear_model)

Call:
lm(formula = result$loss_avg ~ result$day)

Residuals:
    Min      1Q  Median      3Q     Max 
-2.3049 -0.8729 -0.1934  0.9151  2.2740 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept)  2.466600   0.314918   7.833 1.64e-10 ***
result$day  -0.020217   0.009697  -2.085   0.0417 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.204 on 55 degrees of freedom
Multiple R-squared:  0.07324,	Adjusted R-squared:  0.05639 
F-statistic: 4.347 on 1 and 55 DF,  p-value: 0.04174

WEBARENA_IPV4に限定すると増加傾向のように見えます
これも有意じゃなさそうすね

ping$day <-
  as.integer((ping$time - 1664565638) / 60 / 60 / 24) # 計測開始日を0として経過日数
result <- filter(ping, host == "WEBARENA_IPV4") |>
  group_by(day) |>
  summarise(loss_avg = mean(loss))
plot(result$day, result$loss_avg)
linear_model <- lm(result$loss_avg ~ result$day)
abline(linear_model)
summary(linear_model)

> summary(linear_model)

Call:
lm(formula = result$loss_avg ~ result$day)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.89003 -0.30410 -0.08274  0.08652  1.42413 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -0.086525   0.124223  -0.697    0.489    
result$day   0.017755   0.003825   4.642 2.18e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.4751 on 55 degrees of freedom
Multiple R-squared:  0.2815,	Adjusted R-squared:  0.2684 
F-statistic: 21.55 on 1 and 55 DF,  p-value: 2.185e-05

正規性を仮定したときの
10月と11月の平均の両側検定(Welch)

ping$month <- as.integer(format.POSIXct(as.POSIXct(ping$time, origin = "1970-01-01"), "%m"))
ping_Sep <- filter(ping, month == 10)
ping_Nov <- filter(ping, month == 11)
t.test(ping_Sep$loss, ping_Nov$loss, alternative = "two.sided")
> t.test(ping_Sep$loss, ping_Nov$loss, alternative = "two.sided")

    Welch Two Sample t-test

data:  ping_Sep$loss and ping_Nov$loss
t = -0.83635, df = 5255.9, p-value = 0.403
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.22592975  0.09080452
sample estimates:
mean of x mean of y 
0.5634278 0.6309904 

RTT

RTTとパケットロスについては関連なさそうでした

あんまり変化もなかったです

rtt <- function(x, y) {
  r <- round(filter(ping, host == x)$rtt, digits = 1)
  hist(r, breaks = 15, xlab = x)
}
rtt("WEBARENA_IPV6")
rtt("WEBARENA_IPV4")
rtt("ORACLE1_IPV4")
rtt("ORACLE2_IPV4")




ダウンロード速度について

library(dplyr)
rsync <- read.csv(header = TRUE, "rsync.csv")

時間帯でも殆ど変化なかった

hist(rsync$bytes.sec)
summary(rsync$bytes.sec)
rsync$hour <- format.POSIXct(as.POSIXct(rsync$time, origin = "1970-01-01"), "%H")
rsync_group_by_hour <- group_by(rsync,hour) |> 
  summarise(speed_avg = mean(bytes.sec))
barplot(rsync_group_by_hour$speed_avg,names.arg = rsync_group_by_hour$hour)


lossと相関もしなさそう

rsync$yyyymmddhh <- format.POSIXct(as.POSIXct(rsync$time, origin = "1970-01-01"), "%Y%m%d%H")
ping$yyyymmddhh <- format.POSIXct(as.POSIXct(ping$time, origin = "1970-01-01"), "%Y%m%d%H")
ping_group_by_hour <- group_by(ping, yyyymmddhh) |> 
  summarise(loss_avg = mean(loss))
loss_vs_speed <- inner_join(ping_group_by_hour, rsync, by = "yyyymmddhh")
plot(loss_vs_speed$loss_avg, loss_vs_speed$bytes.sec)
cor(loss_vs_speed$loss_avg,loss_vs_speed$bytes.sec, method = "pearson")
> cor(loss_vs_speed$loss_avg,loss_vs_speed$bytes.sec, method = "pearson")
[1] -0.02021064

Discussion