压测时本地端口耗尽问题分析

最近在压测的时候遇到一个问题,python requests库在发起HTTP请求的时候,报错:Failed to establish a new connection errno 99。查了一下,这和错误是因为本地TCP端口耗尽导致的。
因为之前通过打开tcp_timestampstcp_tw_reuse选项解决过这个问题了,这次又出现这个问题,我觉得是时候好好梳理一下这个问题的来龙去脉了。

第一个问题,本地端口有哪些可用?

首先,需要了解到TCP协议中确定一条TCP连接有4要素:local IP, local PORT, remote IP, remote PORT。这个四元组应该是唯一的。
在我们发送HTTP请求的时候,local IP remote IP remote PORT是固定的,只有local PORT是可变的,可用的local PORT的数量就限制了client和server之间TCP连接数的数量 …

more ...

dns相关知识和工具

Authoritative VS non-authoritative

使用nslookup查询域名的时候,经常发现"Non-authoritative answer"这样输出。

那么authoritative/non-authoritative answer分别是什么意思呢?

Authoritative answer:

官方dns server返回的域名解析结果,比如ns1.google.com返回的maps.google.com域名解析的结果(你需要把ns1.google.com配置成你的dns resolver)。

Non-authoritative answer:

非官方dns server返回的域名解析结果,比如你的路由器或者局域网中的dns server返回的maps.google.com域名解析的结果。

参考文档:

  1. meaning of non-authoritative answer
  2. authoritative answer vs non-authoritatice answer

Cache相关

nscd

nscd(name service cache …

more ...

从forked的项目同步代码

从forked项目的master分支同步代码至fork项目的master分支:

1. git remote add upstream <forked project url>
2. git fetch upstream
3. git checkout master #保证本地处于master分支
4. git merge upstream/master #把forked项目的修改merge到本地
5. git push origin master #把本地修改提交到远端仓库(fork项目)的master分支

从forked项目同步新分支到fork项目:

1. git remote add upstream <forked project url>
2. git fetch upstream
3. git checkout -b newbranch …
more ...