我们假设有一个客户端与服务器建立了很多短生命的连接.
如果客户端关闭连接,则客户端上将有许多TIME_WAIT状态的端口.由于客户端耗尽本地端口,因此无法快速进行新的连接尝试.
如果服务器关闭了连接,我会TIME_WAIT在服务器端看到很多s.但是,这有什么害处吗?客户端(或其他客户端)可以继续进行连接尝试,因为它永远不会耗尽本地端口,并且TIME_WAIT服务器端的状态数将增加.最终会发生什么?有什么不好的事吗?(减速,崩溃,掉线等)
请注意,我的问题不是"目的是TIME_WAIT什么?" 但是"如果TIME_WAIT服务器上有这么多状态,会发生什么?" 我已经知道在TCP/IP中关闭连接时会发生什么以及为什么TIME_WAIT需要状态.我不是想解决它,但只是想知道它的潜在问题.
简单来说,让我们说netstat -nat | grep :8080 | grep TIME_WAIT | wc -l打印100000.会发生什么?O/S网络堆栈是否会变慢?"打开文件太多"错误?或者,没什么好担心的?
get()和navigate()方法有什么区别?是否有任何此方法或其他方法等待加载页面内容?我真正需要的是像selenium WaitForPageToLoadWaitForPageToLoad webdriverwebdriver` 这样的东西.
有什么建议?
当使用timed_wait在boost::condition_variable具有持续时间,将等待状态超时即使用户(或NTP)更改系统时间的持续时间后?
例如,
boost::posix_time::time_duration wait_duration(0, 0, 1, 0); // 1 sec
// ** System time jumps back 15 minutes here. **
if( !signal.timed_wait(lock, wait_duration) )
{
// Does this condition happen 1 second later, or about 15 minutes later?
}
Run Code Online (Sandbox Code Playgroud) 我有一个go程序,可以从多个协同程序生成大量的HTTP请求.运行一段时间后,程序会发出错误:connect:无法分配请求的地址.
使用netstat进行检查时,我在TIME_WAIT中获得了一个高数字(28229)的连接.
当协程的数量为3时,会发生大量的TIME_WAIT套接字,并且当它为5时严重到足以导致崩溃.
我在docker下运行Ubuntu 14.4并转到版本1.7
这是go计划.
package main
import (
"io/ioutil"
"log"
"net/http"
"sync"
)
var wg sync.WaitGroup
var url="http://172.17.0.9:3000/";
const num_coroutines=5;
const num_request_per_coroutine=100000
func get_page(){
response, err := http.Get(url)
if err != nil {
log.Fatal(err)
} else {
defer response.Body.Close()
_, err =ioutil.ReadAll(response.Body)
if err != nil {
log.Fatal(err)
}
}
}
func get_pages(){
defer wg.Done()
for i := 0; i < num_request_per_coroutine; i++{
get_page();
}
}
func main() {
for i:=0;i<num_coroutines;i++{
wg.Add(1)
go get_pages()
}
wg.Wait()
}
Run Code Online (Sandbox Code Playgroud)
这是服务器程序: …
我正在尝试使用Python处理大量数据并在MySQL中维护处理状态.但是,我很惊讶没有python-mysql的标准连接池(如Java中的HikariCP).
我最初是从PyMySQL开始的,事情很棒,直到程序运行最初几个小时.几个小时后,事情开始失败.我遇到了很多错误:
pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on '127.0.0.1' ([Errno 99] Cannot assign requested address)")
Run Code Online (Sandbox Code Playgroud)
此外,很多端口都处于TIME_WAIT状态,因为由于缺少连接池,我太频繁地打开和关闭连接
/d/p/950 ??? netstat -nt | wc -l
84752
Run Code Online (Sandbox Code Playgroud)
每本和这个,我试图设置tcp_fin_timeout和ip_local_port_range,但几乎没有任何改善.
echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
echo 15000 65000 > /proc/sys/net/ipv4/ip_local_port_range
Run Code Online (Sandbox Code Playgroud)
然后我发现MySQL提供了带有池功能的mysql.connector .在做完所有这些表现后实际上恶化了.更多流程开始失败.我正在使用Python的多处理模块在24核机器上同时运行29个进程(多处理.Pool默认选择此项).以下是代码,当然我使用.my.cnf传递所有凭据以避免将它们提交给git:
import mysql.connector
from mysql.connector import pooling
conn_pool = pooling.MySQLConnectionPool(pool_name="mypool1",
pool_size=pooling.CNX_POOL_MAXSIZE,
option_files=MYSQL_CONFIG,
option_groups=MYSQL_GROUP_NODE1,
allow_local_infile=True)
conn = conn_pool.get_connection()
Run Code Online (Sandbox Code Playgroud)
最后,还原为旧代码.仍在使用PyMySQL,虽然错误较少,但它仍然是一个重大问题.我查看了SQLAlchemy,并没有真正找到关于池的文档.
我想知道其他人如何处理mysql-python连接池问题?我真的相信应该有一些东西,所以我不必重新发明轮子.
任何指针都非常感谢.
connection-pooling time-wait pymysql mysql-connector-python python-multiprocessing
我编写了一个简单的服务器来扩展SimpleHTTPRequestHandler
如果我在没有向服务器发出任何请求的情况下启动和停止它,我可以开始备份同一个端口,没有任何问题.
启动时,netstat看起来像这样:
sam@hersheezy:server$ sudo netstat -na --program | grep 8001 tcp 0 0 0.0.0.0:8001 0.0.0.0:* LISTEN 23392/python
发出请求后,netstat看起来像这样(即使请求完成后):
sam@hersheezy:server$ sudo netstat -na --program | grep 8001 tcp 0 0 0.0.0.0:8001 0.0.0.0:* LISTEN 23392/python tcp 0 0 127.0.0.1:8001 127.0.0.1:48659 TIME_WAIT -
然后,我使用Cc杀死服务器,netstat看起来像这样(此时我无法重启服务器,因为端口已经在使用):
sudo netstat -na --program | grep 8001 tcp 0 0 127.0.0.1:8001 127.0.0.1:48674 TIME_WAIT -
我显然没有正确地关闭一些东西.我发送回复的代码如下所示:
"""
reply is an object that can be json encoded that is written with a response code 200
"""
def send_provider_reply(self, replyobj): …Run Code Online (Sandbox Code Playgroud) 我必须在 Rails 应用程序中创建 http 连接才能从远程服务器提取一些数据。我正在使用 Net:HTTP,但创建的 http 连接不是持久的。所以我最终有很多处于 TIME_WAIT 状态的套接字,因为这些 http 连接已关闭。有人知道一个好的池化宝石可以保持连接持久并重用它们吗?
我们有ac #web服务和客户端,都是在Visual Studio 2008中创建的(新项目 - > ASP.Net Web服务应用程序).服务托管在Windows Server 2012 R2,IIS 8.5上.
当客户端将数据发送到我们的服务时,我们将其转发给第三方服务,将结果保存到数据库并将其返回给客户端.
问题是,在极少数情况下,当我们的服务负载很重(每秒许多请求)时,它会开始抛出'不足的winsock资源来完成套接字连接启动'.
我们发现我们的Web服务正在打开许多与第三方服务的TCP连接,并使它们处于TIME_WAIT状态.当此类连接的数量达到较高数量(大约17000)时,整个服务器将无法建立任何新连接.从远程桌面到互联网浏览器的一切都停止工作.这持续几分钟,然后,当Windows开始关闭这些连接时,它会恢复正常.
为了与第三方服务进行通信,我们的服务在其整个生命周期中仅使用一个SoapClient实例.它是在初始化时创建的,永远不会被关闭或销毁; 永远不会创建新实例.
BLIND.BLINDSoapClient client = new BLIND.BLINDSoapClient(base.binding, base.address);
Run Code Online (Sandbox Code Playgroud)
将数据发送到第三方服务时,我们只需调用其Web方法,并在不关闭,处置或进行任何清理的情况下将其保留:
BLIND.Answer answer = client.Search(...);
..save to database
return answer;
Run Code Online (Sandbox Code Playgroud)
我们可以做些什么来避免这种time_wait连接的积累?
有没有更好的方法来管理SoapClient?我们应该为每个请求打开一个新的soap客户端并手动关闭它们吗?
如果它是相关的,这是我们的绑定设置方式:
binding = new BasicHttpBinding();
binding.Name = "SLTDSoap";
binding.CloseTimeout = TimeSpan.FromSeconds(Timeout);
binding.OpenTimeout = TimeSpan.FromSeconds(Timeout);
binding.ReceiveTimeout = TimeSpan.FromSeconds(Timeout);
binding.SendTimeout = TimeSpan.FromSeconds(Timeout);
binding.AllowCookies = false;
binding.BypassProxyOnLocal = false;
binding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard;
binding.MaxBufferSize = 65536;
binding.MaxBufferPoolSize = 524288;
binding.MessageEncoding = WSMessageEncoding.Text;
binding.TextEncoding = System.Text.Encoding.UTF8;
binding.TransferMode = TransferMode.Buffered;
binding.UseDefaultWebProxy …Run Code Online (Sandbox Code Playgroud) 我有一个ASP.NET应用程序ListView.我从Active Directory获取数据,现在我想要一个等待符号,如果它ListVew正在构建.我以为我使用了UpdateProgressAjax Control工具包中的Control.但是我不知道如果我点击按钮并且等待符号(例如gif)关闭,如果ListView完成,我将如何使用它.:(
我的CS档案:
protected void btnBenutzerSuchen_Click(object sender, EventArgs e)
{
//If I click on this Button the gif must start
try
{
... // my ListView get data
this.myListView.DataSource = dv;
this.myListView.DataBind();
...
}
catch (Exception)
{
...
}
//If the ListView is finish the gif must close
}
Run Code Online (Sandbox Code Playgroud)
我怎么能这样做 我可以这样做UpdateProgress:
<asp:UpdateProgress ID="UpdateProgress1" DynamicLayout="true" runat="server" AssociatedUpdatePanelID="?" >
<ProgressTemplate>
<div class="progress">
<img src="images/ajax-loader-arrows.gif" /> please wait...
</div>
</ProgressTemplate>
</asp:UpdateProgress> …Run Code Online (Sandbox Code Playgroud) 我们正在与朋友一起开发一个有趣的项目,我们必须执行数百个 HTTP 请求,所有请求都使用不同的代理。想象一下,它类似于以下内容:
for (int i = 0; i < 20; i++)
{
HttpClientHandler handler = new HttpClientHandler { Proxy = new WebProxy(randomProxy, true) };
using (var client = new HttpClient(handler))
{
using (var request = new HttpRequestMessage(HttpMethod.Get, "http://x.com"))
{
var response = await client.SendAsync(request);
if (response.IsSuccessStatusCode)
{
string content = await response.Content.ReadAsStringAsync();
}
}
using (var request2 = new HttpRequestMessage(HttpMethod.Get, "http://x.com/news"))
{
var response = await client.SendAsync(request2);
if (response.IsSuccessStatusCode)
{
string content = await response.Content.ReadAsStringAsync();
}
}
}
} …Run Code Online (Sandbox Code Playgroud)