在 Mac OS X Yosemite (10.10) 中限制上传带宽

psm*_*ith 5 networking bandwidth ipfw pf osx-yosemite

我有 ADSL 互联网,当有应用程序全速上传到互联网时(例如文件上传期间的 Skype 或 Chrome),下载带宽变得非常非常慢。这意味着我在上传过程中几乎无法浏览网页,甚至 ping8.8.8.8需要 2-3 秒;通常这需要不到 0.06 秒。

在 Mac OS X Mavericks (10.9) 和更早版本中,我使用了节流来限制传出流量,因此在上传过程中可以使用互联网。

Throttled 使用 ipfw 进行节流,该功能已从 Yosemite (10.10) 中移除。推荐的替代方法是pf,但 Mac OS X 内核没有 ALTQ 支持,这将启用流量整形(所以我尝试过,所有 altq 命令都被简单地忽略)。

我还尝试了Network Link Conditioner应用程序,但这并没有正确限制传出的包,因此在上传过程中互联网仍然无法使用。平均输出带宽是有限的,但它以几秒钟的周期波动/振荡。

那么如何限制传出带宽呢?或者我怎样才能至少提高 HTTP 流量优先级?我可以ipfw以某种方式安装吗?还有其他想法吗?

更新:目前最适合我的配置是使 HTTP/HTTPS/SSH 不受限制并限制其他所有内容的上传速度。当同时进行云备份和 torrent 上传时,这使得互联网可用。这是脚本:

#!/bin/bash

# Reset dummynet to default config
dnctl -f flush

pfctl -F all

# Compose an addendum to the default config; creates a new anchor
(cat /etc/pf.conf &&
  echo 'dummynet-anchor "my_anchor"' &&
  echo 'anchor "my_anchor"') | pfctl -q -f -

# Configure the new anchor
cat <<EOF | pfctl -q -a my_anchor -f -
no dummynet quick on lo0 all
dummynet out all pipe 1
dummynet out proto icmp all pipe 2
dummynet out proto tcp to any port 443 pipe 2
dummynet out proto tcp to any port 80 pipe 2
dummynet out proto tcp to any port 22 pipe 2
EOF

# Create the dummynet queue
dnctl pipe 1 config bw 30Kbyte/s queue 50
dnctl pipe 2 config queue 50

# Activate PF
pfctl -E
Run Code Online (Sandbox Code Playgroud)

要检查 dnctl 是否正确配置,请运行sudo dnctl list。您应该看到 2 个队列,第一个是有限的,第二个是无限的:

$ sudo dnctl list
00001: 240.000 Kbit/s    0 ms   50 sl. 1 queues (1 buckets) droptail
    mask: 0x00 0x00000000/0x0000 -> 0x00000000/0x0000
BKT Prot ___Source IP/port____ ____Dest. IP/port____ Tot_pkt/bytes Pkt/Byte Drp
    mask: 0x00 0x00000000/0x0000 -> 0x00000000/0x0000
BKT Prot ___Source IP/port____ ____Dest. IP/port____ Tot_pkt/bytes Pkt/Byte Drp
  0 udp         192.168.1.XX/XXX   XX.XX.XX.XX/XXX   1372  1517617  6 8010  96
00002: unlimited    0 ms   50 sl. 1 queues (1 buckets) droptail
    mask: 0x00 0x00000000/0x0000 -> 0x00000000/0x0000
BKT Prot ___Source IP/port____ ____Dest. IP/port____ Tot_pkt/bytes Pkt/Byte Drp
    mask: 0x00 0x00000000/0x0000 -> 0x00000000/0x0000
BKT Prot ___Source IP/port____ ____Dest. IP/port____ Tot_pkt/bytes Pkt/Byte Drp
  0 tcp         192.168.1.XX/XXX   XX.XX.XX.XX/XXX     27     4557  0    0   0
Run Code Online (Sandbox Code Playgroud)

Mat*_*son 2

我在使用新的照片应用程序时遇到了这个问题。安装后,photolibraryd应用程序会在后台上传所有照片,导致您提到的网络拥塞问题。我也安装了 Network Link Conditioner 并设置了 256Kbps 的上传限制。

起初它不起作用。原因很简单:上传是 TCP 连接(端口 443 上的 HTTPS)。启用 NLC 后,我必须先断开连接(我只是关闭 WiFi 一秒钟)。之后,根据新的 NLC 规则恢复上传,我可以同时使用互联网。

如需进一步了解,请查看启用 NLC 之前和之后的 PF 规则。请注意,当 NLC 启用时,您有一个虚拟网络 PF 规则?!是的,Apple 似乎没有支持 ALTQ,而是让 PF 与 dummynet 一起使用。我在我的博客上发布了有关 Mac OS X 上的 PF 的更多信息

更新:不需要 NLC。可以使用直接创建虚拟网络管道和队列dnctl。请阅读随附的手册页,了解使用它的详细说明和示例pf