網路延遲對事務的影響

GreatSQL發表於2024-03-27

1.背景概述

最近在做資料同步測試,需要透過DTS將kafka中的資料同步到資料庫中,4G的資料量同步到資料庫用了大約4個多小時,這看起來並不合理;此時檢視資料庫所在主機的CPU,IO的使用率都不高,沒有瓶頸;最後透過排查發現由於kafka,DTS,資料庫不再同一個機房,網路延遲較大,導致同步速率緩慢;

將kafka,DTS,資料庫部署到同一個機房後,同步速度明顯提升,只需要15分鐘就能同步完。

2.問題復現

本次測試透過sysbench在不同網路延遲的情況下,進行資料寫入及效能壓測,對比網路延遲對資料庫事務的影響。

2.1 檢視當前網路延遲

$ ping 192.168.137.162

PING 192.168.137.162 (192.168.137.162) 56(84) bytes of data.
64 bytes from 192.168.137.162: icmp_seq=1 ttl=64 time=0.299 ms
64 bytes from 192.168.137.162: icmp_seq=2 ttl=64 time=0.180 ms
64 bytes from 192.168.137.162: icmp_seq=3 ttl=64 time=0.297 ms
64 bytes from 192.168.137.162: icmp_seq=4 ttl=64 time=0.329 ms
64 bytes from 192.168.137.162: icmp_seq=5 ttl=64 time=0.263 ms
64 bytes from 192.168.137.162: icmp_seq=6 ttl=64 time=0.367 ms
64 bytes from 192.168.137.162: icmp_seq=7 ttl=64 time=0.237 ms
64 bytes from 192.168.137.162: icmp_seq=8 ttl=64 time=0.160 ms
64 bytes from 192.168.137.162: icmp_seq=9 ttl=64 time=0.180 ms
64 bytes from 192.168.137.162: icmp_seq=10 ttl=64 time=0.257 ms

當前2臺主機在同一個機房,網路延遲大約在 0.3ms 左右

2.2 (正常延遲)透過sysbench寫入資料

2.2.1 建立一張表寫入500W條資料

$ time sysbench lua/oltp_read_write.lua --mysql-db=sysbench --mysql-host=192.168.137.162 --mysql-port=3307 --mysql-user=root --mysql-password=greatdb --tables=1 --table_size=5000000 --report-interval=2 --threads=10 --time=600 --mysql-ignore-errors=all prepare

sysbench 1.1.0-df89d34 (using bundled LuaJIT 2.1.0-beta3)
Initializing worker threads...

Creating table 'sbtest1'...
Inserting 5000000 records into 'sbtest1'

Creating a secondary index on 'sbtest1'...
 
real1m56.459s
user0m7.187s
sys0m0.400s

寫入 500w 資料量耗時 1m56s

2.2.2 sysbench 壓測3分鐘

SQL statistics:
  queries performed:
​    read:               1711374
​    write:              488964
​    other:              244482
​    total:              2444820
  transactions:             122241 (407.37 per sec.)
  queries:               2444820 (8147.45 per sec.)
  ignored errors:            0    (0.00 per sec.)
  reconnects:              0    (0.00 per sec.)

Throughput:
  events/s (eps):            407.3725
  time elapsed:             300.0718s
  total number of events:        122241

Latency (ms):
​     min:                  10.68
​     avg:                  122.72
​     max:                 1267.88
​     95th percentile:            502.20
​     sum:               15000894.94

Threads fairness:
  events (avg/stddev):      2444.8200/14.99
  execution time (avg/stddev):  300.0179/0.02

可以看到 TPS:407.37 QPS:8147.45

2.3透過tc命令模擬網路延遲

tc命令是Linux系統中的一個網路管理工具,用於配置和管理網路流量控制。它可以用來限制網路頻寬、延遲、丟包等,以及實現QoS(Quality of Service)等功能。

# 對ens3網路卡進行延遲設定,設定延遲為10ms
tc qdisc add dev ens3 root netem delay 10ms

如果在使用tc命令時報錯如下錯誤,可以升級一下核心模組

# 報錯
tc qdisc add dev ens3 root netem delay   10ms
Error: Specified qdisc not found.

# 升級
$ yum install kernel-modules-extra*

# 重啟主機
$ reboot

2.4檢視當前網路延遲

$ ping 192.168.137.162

PING 192.168.137.162 (192.168.137.162) 56(84) bytes of data.
64 bytes from 192.168.137.162: icmp_seq=1 ttl=64 time=10.5 ms
64 bytes from 192.168.137.162: icmp_seq=2 ttl=64 time=10.4 ms
64 bytes from 192.168.137.162: icmp_seq=3 ttl=64 time=10.5 ms
64 bytes from 192.168.137.162: icmp_seq=4 ttl=64 time=10.4 ms
64 bytes from 192.168.137.162: icmp_seq=5 ttl=64 time=10.4 ms
64 bytes from 192.168.137.162: icmp_seq=6 ttl=64 time=10.4 ms
64 bytes from 192.168.137.162: icmp_seq=7 ttl=64 time=10.4 ms
64 bytes from 192.168.137.162: icmp_seq=8 ttl=64 time=10.5 ms
64 bytes from 192.168.137.162: icmp_seq=9 ttl=64 time=10.5 ms
64 bytes from 192.168.137.162: icmp_seq=10 ttl=64 time=10.2 ms

網路延遲大約為 10ms

2.3 (延遲10ms)透過sysbench寫入資料

2.3.1 建立一張表寫入500W條資料

$ time sysbench lua/oltp_read_write.lua --mysql-db=sysbench --mysql-host=192.168.137.162 --mysql-port=3307 --mysql-user=root --mysql-password=greatdb --tables=1 --table_size=5000000 --report-interval=2 --threads=10 --time=600 --mysql-ignore-errors=all prepare

sysbench 1.1.0-df89d34 (using bundled LuaJIT 2.1.0-beta3)
Initializing worker threads...

Creating table 'sbtest1'...
Inserting 5000000 records into 'sbtest1'

Creating a secondary index on 'sbtest1'...

real2m11.656s
user0m7.314s
sys0m0.470s

寫入 500w 資料量耗時 2m11s

2.3.2 sysbench 壓測3分鐘

SQL statistics:
    queries performed:
        read:                            788214
        write:                           225204
        other:                           112602
        total:                           1126020
    transactions:                        56301  (187.41 per sec.)
    queries:                             1126020 (3748.16 per sec.)
    ignored errors:                      0      (0.00 per sec.)
    reconnects:                          0      (0.00 per sec.)

Throughput:
    events/s (eps):                      187.4079
    time elapsed:                        300.4196s
    total number of events:              56301

Latency (ms):
         min:                                  210.14
         avg:                                  266.68
         max:                                  493.91
         95th percentile:                      419.45
         sum:                             15014235.80

Threads fairness:
    events (avg/stddev):           1126.0200/1.16
    execution time (avg/stddev):   300.2847/0.16

可以看到 TPS:187.41 QPS:3748.16

3.總結

透過上面的測試可以看出網路延遲較大時,對資料的寫入及每秒執行的事務數都有較大影響;如果需要做效能測試及資料同步,儘量將壓測工具或同步工具部署在同一個機房,避免網路延遲較大,對測試結果有影響。


Enjoy GreatSQL 😃

關於 GreatSQL

GreatSQL是適用於金融級應用的國內自主開源資料庫,具備高效能、高可靠、高易用性、高安全等多個核心特性,可以作為MySQL或Percona Server的可選替換,用於線上生產環境,且完全免費併相容MySQL或Percona Server。

相關連結: GreatSQL社群 Gitee GitHub Bilibili

GreatSQL社群:

社群部落格有獎徵稿詳情:https://greatsql.cn/thread-100-1-1.html

image-20230105161905827

技術交流群:

微信:掃碼新增GreatSQL社群助手微信好友,傳送驗證資訊加群

image-20221030163217640

相關文章