分析临时带宽崩溃的方法/工具

Luc*_*cas 5 bandwidth response-time apache-2.2 bandwidth-measuring

我已经使用 python 端口 mechanize - multi-mechanize测试了我的服务器¹ 。我运行了几个非常简单的测试 - 但我总是从 10 兆位下降到一些 kb 的上传带宽。我不知道为什么。


无论我跑 3.15 分钟还是 30 分钟,对结果都没有影响。有总是一个带宽下降到110和120秒之间的几乎为零,因为你可以在下面的分析给出见。我选择了短期,所以更容易发现下跌。

对 htop 的检查显示没有什么特别之处,内核运行在 2% 到 7% 之间。
内存使用量始终在 2048mb 保证内存中的 1000mb (+-100) 左右。

当我检查 iftop 时,没有什么特别的,但上传从 10 兆字节下降到几千字节约 10 秒(110-120 秒)

所有 cronjobs / 不必要的任务都被禁用。所有页面(正面/随机)均可用。每个请求都由 http 响应代码 200 回答。Apache 和 MySQL 错误日志为空。

由于我是一名边做边学的管理员,我不确定是否有更多相关信息。加载的 apache mod 是否相关?希望我提到了所有重要的事实。

配置文件

[global]
run_time = 180
rampup = 0
results_ts_interval = 10
progress_bar = on
console_logging = off
xml_report = off


[user_group-1]
threads = 10
script = frontpage.py

[user_group-2]
threads = 10
script = randompost.py
Run Code Online (Sandbox Code Playgroud)

首页.py

import mechanize

class Transaction(object):
    def run(self):
        br = mechanize.Browser()
        br.set_handle_robots(False)

        resp = br.open('http://host.domain.tld/')
        resp.read()

        assert (resp.code == 200), 'Bad Response: HTTP %s' % resp.code
        assert ('Example Web Page' in resp.get_data())
Run Code Online (Sandbox Code Playgroud)

随机邮递.py

实际上与首页相同,但具有随机页面

import mechanize
import random

pages = [
'...',
'...',
'...',
# ...
]

class Transaction(object):
    def run(self):
        br = mechanize.Browser()
        br.set_handle_robots(False)

        resp = br.open(random.choice(pages))
        resp.read()

        assert (resp.code == 200), 'Bad Response: HTTP %s' % resp.code
        assert ('Example Web Page' in resp.get_data())
Run Code Online (Sandbox Code Playgroud)

经过时间/响应时间(秒) 经过时间/响应时间(秒) 经过时间/tps




我可以使用哪些工具/方法来缩小造成这种低谷的原因?


更新

正如@linuxdevops 提到的,我尝试使用 scp 和 ftp 下载文件。我的测试包括一个 10mb 的文件和我网站的文件夹 - 意味着许多 1-1xx kb 的文件。没有放弃转移或任何明显的滞后。我不确定是否有更专业的方法来确定FTP/SCP 传输的一致性

¹ vhost 规格

  • 3 个 vcores 一个 1.5GHz
  • 2048 mb ram(保证,无动态ram)
  • 100 兆位带宽
  • centos 6.5 32 位
  • 阿帕奇 2.2.15

小智 1

一个好的起点是使用像 netperf 这样的工具。谷歌一下就能找到

  • 在虚拟主机上启动 netserver 二进制文件
  • 从您的客户端运行 netperf:netperf -H <serverIP> -f M -l 240 -- -s 4194304

    • -f M(以 MB/s 为单位显示输出)
    • -l (长度以秒为单位)
    • --(选项跟在两个破折号后面)
    • -s(插座尺寸)

这是找到正确的套接字/缓冲区大小的简单方法。例如,Windows 中的默认套接字大小仅为 8192。使用拖放操作的副本将使用此默认大小,并且最大速度约为 22 MB/s。一旦将其增加到 64k,您将开始看到 100-120 MB/s。如今,大多数软件都允许您更改此设置,或者对它们经过测试的最佳位置进行硬编码。因此,如果使用winscp、filezilla 或任何实用程序进行这些文件传输,那么您需要检查Linux 中的TCP 缓冲区和Windows 中的winsock 缓冲区。

Linux 示例:/etc/sysctl.conf

  • net.ipv4.tcp_rmem = 4194304 4194304 4194304
  • net.ipv4.tcp_wmem = 4194304 4194304 4194304

视窗:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AFD\Parameters

  • DefaultReceiveWindow = 65536
  • DefaultSendWindow = 65536

重启

如果您可以运行 netperf 超过 120 秒并且没有看到低谷,但随后将实际数据复制到磁盘并且仍然看到它,那么您可以继续对磁盘进行故障排除。如果您尝试各种缓冲区/套接字大小并且仍然看到减少,那么我的下一步将是数据包捕获。

在虚拟主机上:

  1. tcpdump -i <interface> -vvv -nn -s0 port 12865 -w /desiredDir/troughTest.cap
  2. netserver
  3. 来自客户:netperf -H <serverIP> -f M -l 300 -- -s 4194304

让它运行一段时间,然后 ctrl-c 或当你认为你有足够的数据包时终止它。最后,按住 ctrl-c 你的 tcpdump,将 /desiredDir/troughTest.cap 文件传输到你的笔记本电脑/工作站,如果还没有安装wireshark,分析数据包