Java 有办法监控上传接口的网速么,或者能做一些策略进行网速控制么

2024-02-01 09:33:11 +08:00
luomao  luomao

目前在做的一个项目中有超大附件上传的需求,由于公司内网比较快,服务器的带宽经常会被几个人都打满,每次排查都会比较麻烦。于是我想是不是可以有什么方法给我进行一些预警提示,辟如超过 50Mbps 的时候,将当前操作的用户、接口地址、客户端 IP 啥的上报给我。或者是可以动态的限制网速,100Mbps 的内网,调用当前接口的人能动态分配一下各自的网速,留下一些带宽给其他服务。 GPT 给我讲了几个方案,可能是我问法不对,没有得到我想要的

2361 次点击
所在节点   程序员  程序员
20 条回复
ChovyChu
ChovyChu
2024-02-01 09:36:01 +08:00
nginx ?
fenglangjuxu
fenglangjuxu
2024-02-01 09:36:04 +08:00
如果知道接口地址 可以在 NGINX 上配置吧
iyiluo
iyiluo
2024-02-01 09:39:16 +08:00
不是有路由器么,路由器后台加个网速限制,专业的事情还得专业的设备来干
luomao
luomao
2024-02-01 09:44:57 +08:00
@iyiluo #3 因为公司内走内网,外部访问走负载均衡,所以还是想直接在程序中监控和控制最好
luomao
luomao
2024-02-01 09:45:50 +08:00
@fenglangjuxu #2 主要还想监控一下是哪个用户上传的
cslive
cslive
2024-02-01 10:02:00 +08:00
多网卡,对其中一个限速,内网统一访问限速的网卡 ip ,这样你的服务带宽就不会打满了,想打满就用不限速的网卡 ip
c2const
c2const
2024-02-01 10:03:05 +08:00
如果 Java 实现不了,用 C 和 C++呗 :)
最多就是 Java 调用写好的库就行了 :)
datocp
datocp
2024-02-01 10:10:40 +08:00
既然是内网服务器,
一般是网管交换机限速吧,没实施过。。。
如果是 linux 服务器,简单点可以用 iptable limit
专业点那就是 tc 吧,tc 是可以通过 shell 进行动态插值实现动态限速的。当然简单点可以根据 ip 实施 prio 优先极实行有优先极的避让实现。
huangzhiyia
huangzhiyia
2024-02-01 10:34:09 +08:00
给你一段我正在用的,非常好用。

// $1 换成网卡接口名称
tc qdisc del dev $1 root
tc qdisc add dev $1 root handle 1: htb default 20

// 限速 800 Mbs ,突发 4000 Mbs
tc class add dev $1 parent 1:0 classid 1:1 htb rate 800mbit burst 4000mbit

//使用随机公平队列 (sfq) 算法
tc qdisc add dev $1 parent 1:1 handle 10: sfq
tc filter add dev $1 parent 1: protocol ip prio 16 u32 match ip dst 0.0.0.0/0 flowid 1:1

// 下面来自 AI 解释

这是在创建一个分层队列规则,并使用随机公平队列( Stochastic Fairness Queue ,SFQ )算法。SFQ 是一种公平调度算法,旨在确保每个流都能获得公平的带宽份额,以避免某个流占用过多带宽而影响其他流。

具体而言,这个命令在子类别 1:1 上创建了一个 SFQ 队列规则,其句柄为 10:。SFQ 会对数据包进行分类,然后按照一种随机的方式将它们放入队列中,以确保每个流获得相对均匀的带宽共享。

总体而言,这些命令和配置表明你正在设置一个带有分层令牌桶和 SFQ 调度算法的 QoS 策略,用于对网络流量进行管理和控制。这有助于确保在网络上不同的流之间实现公平的带宽分配。
991547436
991547436
2024-02-01 10:39:35 +08:00
单用户网速怎么看不知道,有个其他思路,可以在上传接口获取上传的文件大小和对方 ip ,如果文件过大,可以调用 iptable 去限制该用户的速度,传完解除限速,前提是获取对方的真实 ip ,而不是 nginx 代理的 ip
28Sv0ngQfIE7Yloe
28Sv0ngQfIE7Yloe
2024-02-01 10:46:34 +08:00
舍本逐末了,直接从网卡着手就可以了
159526aa
159526aa
2024-02-01 10:50:30 +08:00
需求还挺多 只有自己用 netty 写逻辑了
fengpan567
fengpan567
2024-02-01 10:54:44 +08:00
加个日志不就行了,打印上传的用户信息和文件大小
realrojeralone
realrojeralone
2024-02-01 11:26:39 +08:00
上传数据时是你代码接收的吗?是的话控制接收速度就可以了
zsj1029
zsj1029
2024-02-01 12:28:32 +08:00
客户端做比较容易,或者用缓冲区流速控制
1194129822
1194129822
2024-02-01 13:58:52 +08:00
看你用的什么框架,想要做到什么程度,业务层面上一般很难实现。
4 层的 TCP 自带流量控制,只要控制 read 的速度,对面自然会降低发送的速度,nginx 和 netty 的流量控量就是基于此。
4 层流量控制是基于连接,如果对面使用多线程,TCP 想要实现单机流量控制就比较麻烦一些。这时候使用网关和防火墙的基于 IP 流量控制就能实现单机流量控制。
如果是分布式流量控制呢?基于用户,对接口限流,配合单机流量控制,等等。
Richared
2024-02-01 14:46:19 +08:00
之前搞网关都是 openresty+lua 实现的,这些不用写在业务里吧。
salmon5
2024-02-01 16:53:07 +08:00
java 这一层不准,(默认)每一层 nginx 都会缓冲流量。
比如用户上传了 1G 的文件,会缓存在 nginx 上,上传完成后,瞬间发给了 java 服务。
Lentin
2024-02-02 09:03:36 +08:00
加块网卡加根网线做个端口聚合不行吗……
zliea
2024-02-02 10:26:45 +08:00
@salmon5 如果时大文件,ng 一般上会增加下边配置,不做缓存。
proxy_buffering off;
proxy_request_buffering off;

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1013279

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX