日常扫盲-线程池&TIME_WAIT

线程池

多线程应用设计是使用线程池来防止访问量过大,导致服务器崩溃,最大最小链接数是基于线程池来说的。
例如,数据库连接池:
连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。这个建立的链接数是设置的最小链接数。而连接的建立、断开都由连接池自身来管理。可以通过其自身的管理机制来监视数据库连接的数量、使用情况等
最大连接数:是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,当其它的客户端等到线程空闲才会得到处理。

TIME_WAIT

TIME_WAIT过多,既占内存又消耗CPU
通常出现time_wait,基本操作:

netstat -a | grep TIME_WAIT | wc -l 一下,查看是不是有很多在等待的线程
接下来一般都会sysctl.conf 修改如下参数(这是不建议修改的)
1:net.ipv4.tcp_tw_recycle = 1(别人链接自己)
2:net.ipv4.tcp_tw_reuse = 1(自己链接别人)
3:net.ipv4.tcp_timestamps = 1(recycle和reuse是需要依赖timestamps才可以生效的)
备注
reuse 打开,是说处于TIME_WAIT 状态的线程可以复用
recycle 打开,是说请求时间在现在wait之后(15分钟在14分钟之后)的可以处理,就会将wait的状态直接销毁,这样会导致同时请求进来的消息,稍前一点的会被丢包
会话关闭,TIME_WAIT状态出现在主动发起关闭会话的一方
由于socket是全双工的工作模式,一个socket的关闭,是需要四次握手来完成的。
出现TIME_WAIT状态的连接,一定出现在主动关闭连接的一方。所以,当主动关闭连接的一方,再次向对方发起连接请求的时候(例如,客户端关闭连接,客户端再次连接服务端,此时可以复用了;负载均衡服务器,主动关闭后端的连接,当有新的HTTP请求,负载均衡服务器再次连接后端服务器,此时也可以复用),可以复用TIME_WAIT状态的连接,但是被发起关闭会话的服务,会有一个中间状态close_wait,之后才是TIME_WAIT,最后关闭会话。
UTF-8编码:
UTF-8、UTF-16、UTF-32都是Unicode的一种实现。
Unicode为世界上所有字符都分配了一个唯一的数字编号,
Unicode就相当于一张表,建立了字符与编号之间的联系


posted @ 2019-11-22 11:44  默晓梦  阅读(836)  评论(0编辑  收藏  举报