Linux过多TIME_WAIT问题解决

0x00 问题

一个服务器运行用nginx的web服务,PHP访问mysql;由于php需要频繁的访问数据库,而且使用的都是短链接,因此一段时间内产生并保持大量的TIME_WAIT。

$ netstat -an | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

LAST_ACK 11
LISTEN 11
SYN_RECV 42
ESTABLISHED 172
FIN_WAIT1 13
FIN_WAIT2 11
CLOSING 1
SYN_SENT 38
TIME_WAIT 3792

0x01 危害

系统长期保持大量的TIME_WAIT,相应的会占用大量的系统资源,同时还会占用大量的端口和连接数,导致新来的请求无法被服务器及时响应处理;默认情况下,linux临时端口号范围是(32768,61000),本机可用于调用的端口约3万个,进而导致调用后端服务阻塞,页面响应变慢;

0x02 解决办法

根据以上分析,需要对系统内核参数进行优化,启用TIME_WAIT连接重用,TIME_WAIT连接回收、缩短连接保持时间、增加可用端口数:

vi /etc/sysctl.conf

net.ipv4.tcp_tw_reuse = 1                   # 连接重用
net.ipv4.tcp_tw_recycle = 1                 # 连接回收
net.ipv4.tcp_fin_timeout = 30               # 连接保持时间
net.ipv4.ip_local_port_range=1024 65000     # 增加端口数量

sysctl -p    # 生效

通常情况下,设置前三条即可,减少了TIME_WAIT数量,端口占用也会缓解,但如果服务的并发量本来就很大,增加端口数量就很有必要;

优化生效后,TIME_WAIT明显减少:

$ netstat -an | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

LAST_ACK 17
LISTEN 11
SYN_RECV 25
ESTABLISHED 107
FIN_WAIT1 9
FIN_WAIT2 23
CLOSING 2
SYN_SENT 14
TIME_WAIT 217

0x03 注意

  • 需要确认 net.ipv4.tcp_timestamps = 1 是打开的(默认是打开的),因为只有timestamps打开了,net.ipv4.tcp_tw_recycle = 1 才会生效;

  • net.ipv4.tcp_timestampsnet.ipv4.tcp_tw_recycle 同时打开,对通过NAT网关访问服务器的连接会有问题,因为 tcp_tw_recycle/tcp_timestamps 都开启的条件下,60s内同一源ip主机的socket connect请求中的timestamp必须是递增的。而timestamp时间为系统启动到当前的时间,因此,不同客户端的timestamp不相同,timestamp 大的客户端可以正常访问,timestamp小的客户端则访问失败; 这种情况建议关闭 tcp_tw_recycle 选项,而不是 timestamp;因为 在tcp timestamp关闭的条件下,开启tcp_tw_recycle是不起作用的;而tcp timestamp可以独立开启并起作用。

0x04 总结

  • 使用过多的短连接,导致了大量的TIME_WAIT;在服务设计时,应尽量采用长连接,连接池,KEEPALIVE等技术减少对后端的连接次数,提高连接的效率。

  • 这次的问题,因PHP本身的特性,一个页面处理完成后,所有相关连接就断了,不太好使用长连接,连接池,KEEPALIVE技术;

0x05 确有频繁访问时,以上设置并不能减少 TIME_WAIT

  • 当服务器却又很多用户频繁访问,以上针对系统的优化并不能达到效果。

  • 原因试试php页面访问mysql采用的是短连接,用完就断开,频繁访问必然产生很多TIME_WAIT;

  • 解决办法, 采用长连接的方式访问数据库,这里采用php的PDO扩展访问mysql,长连接还能提高性能:

   lang="php">$db_host="localhost:3306";
    $db_username="user";
    $db_password="";
    $dsn = "mysql:host=$db_host;dbname=$database;";
    
    try {
     $sql = new PDO($dsn,$db_username,$db_password,array(PDO::ATTR_PERSISTENT => true));//PDO::ATTR_PERSISTENT => true 表示采用持久化连接;
    } catch(PDOException $e){
     die($e->getMessage());
    }
    
    try{
     $result = $sql->query("select * from accounts where id = '".$sn."';");
     } catch(PDOException $e){
     die($e->getMessage());
     }
     $rows = $result->fetchAll(PDO::FETCH_ASSOC);// 这里要注意,查询结果只能调用一次fetch,后面再调用就返回空了,所以这个地方第一次调用就要保存下来给后续使用;
     if(count($rows) == 1){
     $row = $rows[0];// 多个结果时,foreach 遍历即可
     .....
     }
    或者:
     foreach($dbh->query('SELECT * from FOO') as $row) {
     print_r($row);
     }
  • php7.2 设置支持PDO扩展

vim /etc/php/7.2/cli/php.ini 这个配置文件是配置php命令行运行环境;
vim /etc/php/7.2/fpm/php.ini 这个配置 php-fpm,里面 extension=pdo_mysql 是注释掉的,但是 /etc/php/7.2/fpm/conf.d/20-pdo_mysql.ini 中有定义,所以应该是默认支持pdo的;</pre>

打开注释: extension=pdo_mysql 即可;

系统优化后,再使用PDO长连接访问mysql,TIME_WAIT连接数,直线下跌几乎没有;

原文

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,997评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,603评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,359评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,309评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,346评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,258评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,122评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,970评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,403评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,596评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,769评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,464评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,075评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,705评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,848评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,831评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,678评论 2 354

推荐阅读更多精彩内容