bthulu

bthulu

V2EX 第 494632 号会员,加入于 2020-06-14 09:52:58 +08:00
今日活跃度排名 21903
nginx 是怎么实现 tps>2000 的, 理论上这不可能呀
程序员  •  bthulu  •  20 小时 32 分钟前  •  最后回复来自 paceewang1
25
react 的 setState 用来自增, 是线程安全的吗?
React  •  bthulu  •  22 天前  •  最后回复来自 ColdBird
13
普通家用电脑可以关闭 TPM 防止升级到 win11 吗?
Windows  •  bthulu  •  73 天前  •  最后回复来自 testcaoy7
11
bthulu 最近回复了
18 小时 17 分钟前
回复了 nirayxu 创建的主题 Android 求推荐看 epub 没有乱七八糟广告的 app
neat reader+1
21 小时 22 分钟前
回复了 PierreGasly 创建的主题 Android 快要入职了,求推荐工作用国产手机
iqoo11 或 iqoo11s, 闲鱼 2000 左右, 选那种电池健康度 100%的, 基本出厂不到三个月, 跟新的一模一样.
@InkStone
@flyqie
@chenyu0x00
@pengjay
@ccnoobs
刚才实测, 同一个客户端, 先向服务端 1 发送 7 万次请求, 再向服务端 2 发送 7 万次请求.

结果是向服务端 1 发送到 6 万多次时就报 SocketException: 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。

再向服务端 2 发请求时, 一次请求都发不出去.

实践证明在 windows 上, 端口是共用的, 若通过端口 9000 请求 dstIp1 并关闭后, 9000 端口进入 time_wait 状态, 此时往其他 dstIp 发送请求时也无法使用这个端口.

服务端代码
```C#
using System.Net;
using System.Net.Sockets;

int port = 9000;
TcpListener server = new TcpListener(IPAddress.Any, port);
server.Start();
Console.WriteLine($"Server listening on :{port}");

try
{
var writer = File.AppendText("c:/temp/a.txt");
List<int> ports = [];
while (true)
{
TcpClient client = server.AcceptTcpClient();
IPEndPoint endPoint = (IPEndPoint)client.Client.RemoteEndPoint!;
ports.Add(endPoint.Port);
if (ports.Count > 10)
{
writer.WriteLine(string.Join("\r\n", ports));
writer.Flush();
ports.Clear();
}
}
}
catch (SocketException e)
{
Console.WriteLine($"SocketException: {e}");
}
finally
{
server.Stop();
}
```

客户端代码
```C#
public class UnitTest1
{
[TestMethod]
public async Task TestMethod1()
{
int k = 0;
for (int j = 0; j < 70; j++)
{
List<Task> list = [];
for (int i = 0; i < 1000; i++)
{
k++;
Task task = OpenAndCloseTcp("10.98.20.129");
list.Add(task);
}

await Task.WhenAll(list);
Console.WriteLine(k);
}
}

[TestMethod]
public async Task TestMethod2()
{
int k = 0;
for (int j = 0; j < 70; j++)
{
List<Task> list = [];
for (int i = 0; i < 1000; i++)
{
k++;
Task task = OpenAndCloseTcp("10.98.20.130");
list.Add(task);
}

await Task.WhenAll(list);
Console.WriteLine(k);
}
}

private async Task OpenAndCloseTcp(string ip)
{
using var client = new TcpClient();
await client.ConnectAsync(ip, 9000);
await using NetworkStream stream = client.GetStream();
byte[] bytes = "\r\n"u8.ToArray();
await stream.WriteAsync(bytes);
}
}
```
@chenyu0x00 我就说为啥我这突破不了 2000 了, 我还以为哪里配置有问题. 我这里是代理了 Modbus 主服务器, 走的是短链接 tcp 协议, 不是 http. Modbus 主服务器是施耐德的 PLC, 限制只能短链接. 这种情况下, 还有什么别的办法突破 2000 这个限制吗?
@chenyu0x00 但是 nginx 反代呢, 他跟后端服务器之间, nginx 的 IP 是固定的, 后端服务器的 IP 和端口也是固定的, 这个时候只有 nginx 的端口是动态的了. 可不可以认为这种情况下, nginx 的 TPC 不可能>2000?
@codehz nginx 不是服务端呀, nginx 是做反向代理, 是客户端. benchmark 程序可以使用端口复用, nginx 应该是不会端口复用的吧?
也就是说, 就是 keep-alive 确保了可以突破 2000?
@InkStone 这跟四元组有什么关系? nginx 压测, 后端起一个服务器, nginx 代理请求到这个服务器, 测试端全部是短链接请求, dstPort,dstIp, srcIp 都是固定的, 只有 srcPort 是变化的.
我司用的国产古方金丝楠木发布
5 天前
回复了 jmychou 创建的主题 程序员 生产环境 SpringBoot Tomcat 线程卡住
看看是不是有人在接口里写了一句 thread.sleep
7 天前
回复了 Tsccai 创建的主题 MySQL MySQL 安装路径不能有中文吗?
@huanxi0701 小皮是什么
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5660 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 23ms · UTC 06:13 · PVG 14:13 · LAX 23:13 · JFK 02:13
Developed with CodeLauncher
♥ Do have faith in what you're doing.