经过搜索发现这个报错是因为端口耗尽而导致的。
原因可能:
如果是服务端出现大量time wait的话,可以调一下linux系统参数。
核心原理: >先分析原因。
你出现这个错误是因为你没有了解ASPNET的工作原理。ASPNet 和php,jsp ,asp等服务器语言一样 都是为了生成可供浏览器解析的页面,而可供浏览器解析的语言只有HTML。
1,如果你在aspx页面中插入一个asp:LinkButton 那么运行页面后 在浏览器中查看源代码你会发现这个标签实际被转为了一个<a>标签。
2,为什么你的写法不会转换呢?因为首先 传递给Literal1Text 的值在aspnet中作为一段字符串被直接输出到浏览器中。那么你的写法到浏览器后源代码中仍然是一个asp:LinkButton 标签,而这个标签是无法被浏览器正确解析的。
解决办法:
知道了原因,那么如果非要按照你的写法去写,那么应该是这样的:
Literal1Text = "<li>" + ((users)Session["users"])NameToString() + "</li><li> </li><li><a ID='LinkButton1' onclick='LinkButton1_Click1'>注销</a></li><li> </li><li>信息修改</li><li> </li>";
但是当你修改完后发现点击注销按钮依然不能执行!为什么呢?
因为你的LinkButton1_Click1 事件并没有在aspnet中被解析为可供浏览器识别的js代码。
如何解决?
首先吐槽下你的写法实在另类, 但是依然可以实现。
在aspx页面中写一个asp:LinkButton按钮:
<asp:LinkButton ID='LinkButton2' runat='server' onclick='LinkButton1_Click1'>注销</asp:LinkButton>
运行页面,查看源代码 看看这个新加的注销按钮被解析为了什么html代码,大概如下
<a id="LinkButton2" onclick="xxxxx"></a>
将新加的linkbutton 设置不可见属性
<asp:LinkButton ID='LinkButton2' runat='server' visible="false" onclick='LinkButton1_Click1'>注销</asp:LinkButton>
重新修改后台代码
Literal1Text = "<li>" + ((users)Session["users"])NameToString() + "</li><li> </li><li><a ID='LinkButton1' onclick='xxxxx'>注销</a></li><li> </li><li>信息修改</li><li> </li>";
//也就是将标签的js事件绑定到那个隐藏的注销按钮事件上。netstat -ano windows下查看当前所有的tcp连接
netstat -ano |findstr "8080" windows下查看所有8080端口的tcp连接
netstat -ano |findstr "TIME_WAIT" windows下查看所有的“TIME_WAIT”状态的tcp连接
netstat -ano |find /i /c "TIME_WAIT" windows下统计time_wait出现的次数(按行统计) /i 忽略大小写# netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c
68 CLOSE_WAIT
2 CLOSING
136 ESTABLISHED
38 FIN_WAIT1
16 FIN_WAIT2
2 LAST_ACK
8 LISTEN
71 SYN_RECV
2936 TIME_WAIT
#
状态:描述
CLOSED:无连接是活动的或正在进行
LISTEN:服务器在等待进入呼叫
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接
ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另一边已同意释放
ITMED_WAIT:等待所有分组死掉
CLOSING:两边同时尝试关闭
TIME_WAIT:另一边已初始化一个释放
LAST_ACK:等待所有分组死掉
linux sysctlconf close_wait
$ /proc/sys/net/core/wmem_max
最大socket写buffer,可参考的优化值:873200
$ /proc/sys/net/core/rmem_max
最大socket读buffer,可参考的优化值:873200
$ /proc/sys/net/ipv4/tcp_wmem
TCP写buffer,可参考的优化值: 8192 436600 873200
$ /proc/sys/net/ipv4/tcp_rmem
TCP读buffer,可参考的优化值: 32768 436600 873200
$ /proc/sys/net/ipv4/tcp_mem
同样有3个值,意思是:
netipv4tcp_mem[0]:低于此值,TCP没有内存压力
netipv4tcp_mem[1]:在此值下,进入内存压力阶段
netipv4tcp_mem[2]:高于此值,TCP拒绝分配socket
上述内存单位是页,而不是字节可参考的优化值是:786432 1048576 1572864
$ /proc/sys/net/core/netdev_max_backlog
进入包的最大设备队列默认是300,对重负载服务器而言,该值太低,可调整到1000
$ /proc/sys/net/core/somaxconn
listen()的默认参数,挂起请求的最大数量默认是128对繁忙的服务器,增加该值有助于网络性能可调整到256
$ /proc/sys/net/core/optmem_max
socket buffer的最大初始化值,默认10K
$ /proc/sys/net/ipv4/tcp_max_syn_backlog
进入SYN包的最大请求队列默认1024对重负载服务器,增加该值显然有好处可调整到2048
$ /proc/sys/net/ipv4/tcp_retries2
TCP失败重传次数,默认值15,意味着重传15次才彻底放弃可减少到5,以尽早释放内核资源
$ /proc/sys/net/ipv4/tcp_keepalive_time
$ /proc/sys/net/ipv4/tcp_keepalive_intvl
$ /proc/sys/net/ipv4/tcp_keepalive_probes
这3个参数与TCP KeepAlive有关默认值是:
tcp_keepalive_time = 3600 seconds (1 hours)
tcp_keepalive_probes = 3
tcp_keepalive_intvl = 60 seconds
意思是如果某个TCP连接在idle 2个小时后,内核才发起probe
如果probe 3次(每次60秒)不成功,内核才彻底放弃,认为该连接已失效
对服务器而言,显然上述值太大 可调整到:
/proc/sys/net/ipv4/tcp_keepalive_time 120
/proc/sys/net/ipv4/tcp_keepalive_intvl 30
/proc/sys/net/ipv4/tcp_keepalive_probes 2
$ proc/sys/net/ipv4/ip_local_port_range
指定端口范围的一个配置,默认是32768 61000,已够大
在大并发时可以调成1024 65535
下面是处理time_wait状态时需要处理的一些参数
netipv4tcp_syncookies = 1
表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
netipv4tcp_tw_reuse = 1
表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
netipv4tcp_tw_recycle = 1
表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
netipv4tcp_fin_timeout = 30
表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。
netipv4tcp_keepalive_time = 1200
表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
netipv4ip_local_port_range = 1024 65000
表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。
netipv4tcp_max_syn_backlog = 8192
表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
netipv4tcp_max_tw_buckets = 5000
表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。
默认为 180000,改为 5000。对于Apache、Nginx等服务器,上面提到的参数可以很好地减少TIME_WAIT套接字数量,
避免Squid服务器被大量的TIME_WAIT套接字拖死,此项参数可以控制TIME_WAIT套接字的最大数量。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)