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

281 天前
 luomao

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

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

// $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
281 天前
单用户网速怎么看不知道,有个其他思路,可以在上传接口获取上传的文件大小和对方 ip ,如果文件过大,可以调用 iptable 去限制该用户的速度,传完解除限速,前提是获取对方的真实 ip ,而不是 nginx 代理的 ip
28Sv0ngQfIE7Yloe
281 天前
舍本逐末了,直接从网卡着手就可以了
159526aa
281 天前
需求还挺多 只有自己用 netty 写逻辑了
fengpan567
281 天前
加个日志不就行了,打印上传的用户信息和文件大小
realrojeralone
281 天前
上传数据时是你代码接收的吗?是的话控制接收速度就可以了
zsj1029
281 天前
客户端做比较容易,或者用缓冲区流速控制
1194129822
281 天前
看你用的什么框架,想要做到什么程度,业务层面上一般很难实现。
4 层的 TCP 自带流量控制,只要控制 read 的速度,对面自然会降低发送的速度,nginx 和 netty 的流量控量就是基于此。
4 层流量控制是基于连接,如果对面使用多线程,TCP 想要实现单机流量控制就比较麻烦一些。这时候使用网关和防火墙的基于 IP 流量控制就能实现单机流量控制。
如果是分布式流量控制呢?基于用户,对接口限流,配合单机流量控制,等等。
Richared
281 天前
之前搞网关都是 openresty+lua 实现的,这些不用写在业务里吧。
salmon5
281 天前
java 这一层不准,(默认)每一层 nginx 都会缓冲流量。
比如用户上传了 1G 的文件,会缓存在 nginx 上,上传完成后,瞬间发给了 java 服务。
Lentin
280 天前
加块网卡加根网线做个端口聚合不行吗……
zliea
280 天前
@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