精华内容
下载资源
问答
  • #!/bin/bash >hoststatus.txt fastping() { if ping ${ip} -c 1 > /dev/null 2>...[color=#FF0000]wait[/color] ...我想知道这里的wait是表示什么意思?请高手帮忙解答下,谢谢。
  • 小弟不才,看《c++并发编程实战》第四章atm简单实现时,碰到以下代码,百思不得其解,请大神帮忙解释一下,为什么可以连着接3个handle呢,这是什么语法? 简单ATM实现的getting_pin状态函数,digit_pressed、clear_...
  • 什么这块的内容经常被面试官问及到呢,因为这块体现的不仅仅基础扎不扎实的问题,还涉及到了你未来在实战当中解决棘手问题的潜力有多少。TCP的四次握手在我们开发中经常被使用到,例如HTTP通信、数据库连接等等...

    0810f4f6dc1d9bceabf7edff7ee0bd54.png

    上一篇文章中,我们聊到了有个朋友面头条被问及到大量网络通信的基础知识,其中聊到了TIME_WAIT状态相关的问题,TIME_WAIT相关知识点涉及到了TCP的四次握手。为什么这块的内容经常被面试官问及到呢,因为这块体现的不仅仅是基础扎不扎实的问题,还涉及到了你未来在实战当中解决棘手问题的潜力有多少。

    TCP的四次握手在我们开发中经常被使用到,例如HTTP通信、数据库连接等等各种通信连接。有时候这类通信在线上环境经常出现性能瓶颈或异常,特别是网络通信异常,所以知道如何分析底层的网络通信状态是我们解决问题的方法之一。

    今天我们从以下几个问题入手,将这类问题了解透彻:

    • 什么是TCP四次握手;

    • 那为什么TCP断开连接又是四次握手呢;

    • 为什么需要TIME_WAIT状态;

    • 服务端为什么会出现大量TIME_WAIT;

    • 大量TIME_WAIT状态会造成什么影响;

    • 如何优化TIME_WAIT过多的场景。

    什么是TCP四次握手

    在数据发送完成后,由一端主动发起断开连接。这个时候基于TCP的连接需要经过四次握手才能完成连接的断开。具体的流程如下图所示:

    a674032575b227a8217a501d9c17b10b.png

    (1)首先,Client发送一个关闭连接标志位FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。

    (2)其次,Server收到FIN标识之后,会发送一个确认序号ack给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。

    (3)然后,Server在确认没有数据发送之后,也会发送一个关闭连接标识FIN给客户端,Server进入LAST_ACK状态。

    (4)最后,Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个确认序号ack给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

    那为什么TCP断开连接又是四次握手呢?

    这是因为TCP连接是双向传输模式,在成功建立连接之后,双方都可以主动同时向对方发送或接收数据。所以在一方关闭连接时,会发送指令告知对方,我要关闭连接了。这时对方会回一个ACK,此时只是一个方向的连接关闭。但是另一个方向仍然可以继续传输数据,等到发送完了所有的数据后,会发送一个FIN段来关闭此方向上的连接。接收方发送ACK确认关闭连接。

    为什么需要TIME_WAIT状态

    我们可以通过以上的流程图,可以发现TIME-WAIT状态会等待2MSL(MSL为Maximum Segment Lifetime英文的缩写,表示报文最大生存时间,RFC中规定MSL为2分钟,实际应用中常用的是30秒,1分钟和2分钟等)的时间,这又是为什么呢?这是因为虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态,但是我们不能确定在TIME_WAIT状态发送出去的ACK报文就一定会被对方收到,其中有可能网络延迟或数据丢失等原因导致对方无法及时收到ACK报文,此时对方就会一直处于LAST_ACK状态导致超时,又重新发送FIN报文,如果此时发起方已经处于CLOSE状态,将会导致服务器就无法按照正常步骤进入CLOSED状态。

    服务端为什么会出现大量TIME_WAIT状态?

    在理清楚这个问题之前,我们先把下面这个问题了解清楚:一次http请求,谁先断开TCP连接?什么情况下客户端先断,什么情况下服务端先断?

    可能大部分同学都认为,在一次http请求之后,是由客户端主动发起断开连接的。然而事实未必是这样的,在最初的HTTP1.0中,http请求是短连接的,在HTTP协议请求头中,存在一个connection字段,默认值为close。如果客户端的请求头中的connection为close,则表示客户端在发送请求之后,会关闭掉这个连接;如果服务端返回头中的connection为close,则表示服务端在发送完数据之后,会主动断开连接。

    在HTTP1.1版本中,http通信已经开始使用长连接状态了,请求头中的connection的值则默认为keep-alive。如果结果为keepalive,那么,服务端在输出完响应体后,会设置当前连接的keepalive属性,然后等待客户端下一次请求。当然,服务端不可能一直等待下去,如果客户端一直不发数据过来,岂不是一直占用这个连接?所以当服务端设置了keepalive等待下一次的请求时,同时也会设置一个最大等待时间,这个时间是通过选项keepalive_timeout来配置的,如果配置为0,则表示关掉keepalive,此时,http版本无论是1.1还是1.0,客户端的connection不管是close还是keepalive,都会强制为close。

    如果服务端最后的决定是keepalive打开,那么在响应的http头里面,也会包含有connection头域,其值是”Keep-Alive”,否则就是”Close”。如果connection值为close,那么在服务端响应完数据后,会主动关掉连接。所以,对于请求量比较大的服务端来说,关掉keepalive最后会产生比较多的time-wait状态的socket。一般来说,当客户端的一次访问,需要多次访问同一个server时,打开keepalive的优势非常大,比如图片服务器,通常一个网页会包含很多个图片。打开keepalive也会大量减少time-wait的数量。

    大量TIME_WAIT状态会造成什么影响

    在高并发短连接的TCP服务器上,当服务器处理完请求后立刻主动正常关闭连接。这个场景下会出现大量socket处于TIME_WAIT状态。如果客户端的并发量持续很高,高并发可以让服务器在短时间范围内同时占用大量端口,而端口有个0~65535的范围,并不是很多,刨除系统和其他服务要用的,剩下的就更少了,此时部分客户端就会显示连接不上。

    这里有个相对长短的概念,比如取一个web页面,1秒钟的http短连接处理完业务,在关闭连接之后,这个业务用过的端口会停留在TIMEWAIT状态几分钟,而这几分钟,其他HTTP请求来临的时候是无法占用此端口的,服务器资源严重浪费。

    netstat -ant|awk '/^tcp/ {++S[$NF]} END {for(a in S) print (a,S[a])}'LAST_ACK 14SYN_RECV 348ESTABLISHED 70FIN_WAIT1 229FIN_WAIT2 30CLOSING 33TIME_WAIT 18122

    如何优化TIME_WAIT过多的场景

    我们可以通过开启重用机制(修改net.ipv4.tcp_tw_reuse为1)来允许将TIME-WAIT sockets重新用于新的TCP连接,这种方式可以使得一些长时间没有释放的TIME_WAIT状态的连接得以被重复使用,提升了系统的连接数量。

    另外,操作系统还具有另外两个配置项,一个是快速回收状态为TIME_WAIT的连接的设置net.ipv4.tcp_tw_recycle,另一个则是通过修改配置net.ipv4.tcp_fin_timeout设置一个较短的超时时间。

    编辑内核文件/etc/sysctl.conf:

    net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。net.ipv4.tcp_fin_timeout 修改系默认的 TIMEOUT 时间

    然后执行 /sbin/sysctl -p 让参数生效。

    4e1c17d978f06f8df752ffdca17c64f6.gif

    end

    往期推荐

    • 【网络通信】两次面试(蚂蚁金服和头条)都被问到——TCP是如何实现拥塞控制的?

    • 【MySQL】MVCC:数据库是如何实现高性能的并发读写操作的

    • 【穷举法】三个水桶等分八升水问题

    展开全文
  • RT [img=https://img-bbs.csdn.net/upload/201504/01/1427869561_13443.jpg][/img]
  • 什么意思 5 jjzhou91 | 浏览 3167 次 我有更好的答案 推荐于2016-03-10 02:06:53 最佳答案 这JQuery。$('#wait_pls'):查找出id值为wait_pls的对象show()将查找出的对象显示出来...

    html中 $('#wait_pls').show();什么意思 5

    jjzhou91 | 浏览 3167 次
    我有更好的答案
    推荐于2016-03-10 02:06:53 最佳答案
    这是JQuery。
    $('#wait_pls'):查找出id值为wait_pls的对象
    show()是将查找出的对象显示出来,如果该对象为隐藏对象,将其显示;如果该对象为显示对象,则无任何效果。

    其他回答

    $是jquery封装javascript后的一个对象,相当于js中的window。$()则是一个选择器,里面写不同的表达式,可以获得不同的html元素,获取不到则是undefind。show()是jquery中动态中的一个方法,调用这个方法则会使该HTML元素变为显示状态,相当于将其的DISPLAY属性改为block
    846564997  | 发布于2013-01-04 15:59
    评论 
    5 0
    这个是jquery的一种写法;
    $('#wait_pls'):获取页面中id为wait_pls的对象;
    show()是jquery自带的方法,如果对象为隐藏的,则将其显示出来。
    qq247321534  | 发布于2013-01-04 15:16
    评论 
    1 0
    展开全文
  • rttttttttttttttttttttttttttttt
  • 最近热播的《青春有你2》姐妹们追了吗?有多少人像单元一样,完全奔着Lisa去的~在...我认真研究了一下Lisa的穿搭,短款上衣、格子裙、吊带、短T......wait!这不就是今年火的一塌糊涂的BM风吗?Black Pink里可...

    最近热播的《青春有你2》姐妹们追了吗?有多少人是像单元一样,完全是奔着Lisa去的~在生活中完全是“小憨憨”的Lisa,在舞台上那真的是光芒四射啊!每一个动作精准到位!完全就是行走的舞蹈Queen~

    每次看到Lisa真的是被她那种又甜又酷的劲儿迷的不要不要的!我认真研究了一下Lisa的穿搭,短款上衣、格子裙、吊带、短T......wait!这不就是今年火的一塌糊涂的BM风吗?

    Black Pink里可不止Lisa,“人间香奈儿”的Jennie可不就对BM风的Crop Top爱到了极致么!不管是机场秀、日常风还是时装,它都不会缺席~不仅显得胸大腰细,还能拉长身材比例,这种可盐可甜的小性感,试问谁不可!

    除了南韩女团,欧阳娜娜和宋妍霏都快成为BM风的野生代言人了!放眼望去,私服穿搭里随便就能看到BM风的影子~

    既然这样,今天单元就来和姐妹们认真聊一聊这个实红的BM风穿搭到底是什么?成为女团的第一步可就靠它了!

    什么是BM风?

    be4b96dfb1558451e070f0643900d6b5.png

    BM风

    其实BM风就是小众品牌Brandy Melville衍生出来的一种穿搭风格,相比较于Zara、HM这一类型的快时尚品牌,Brandy Melville个性鲜明,风格独特,价格亲民,而且也不容易撞衫。

    来源:太平洋时尚网

    展开全文
  • 输入 top 命令,的确可以看到一系列 cpu 使用率,其中一个值得注意的子项就是 io 使用率了,如下图:top 命令上图中 io 前面的数字是什么意思呢?是指 CPU 有 63% 的时间花费在 io 上了吗?在 Linux 中输入 man 命令...

    最近在做连续数据流的缓冲系统,C语言代码实现后,粗略测试了下,功能上应该没有问题。那么,接下来就该测试性能了。输入 top 命令,的确可以看到一系列 cpu 使用率,其中一个值得注意的子项就是 io 使用率了,如下图:

    ecb92d9a5d5d664e48e406eb2a972655.png

    top 命令

    上图中 io 前面的数字是什么意思呢?是指 CPU 有 63% 的时间花费在 io 上了吗?在 Linux 中输入 man 命令查看相关手册,发现 io(wait) 被解释为“等待 I/O 完成的时间”。

    ecc9c6afbe82fc02ac6bd9b571f76e9b.png

    “等待 I/O 完成的时间”

    如果按照手册对 iowait 字面上的解释,是很容易陷入误区的。因为就上例而言,似乎 CPU 有 63% 的时间消耗在等待 I/O 操作完成,导致 CPU 的性能白白浪费这么多。

    其实不是的,Linux 是一个成熟的操作系统,它才不会让 CPU 宝贵的性能白白浪费在耗时的 I/O 等待上,实际上,如果当前系统还有其他任务需要使用 CPU,Linux 会将等待 I/O 完成的任务暂时挂起,将 CPU 使用权暂时交给有需要的任务。

    那么 iowait 到底是什么意思呢?

    有人认为,iowait 只是 CPU 空闲(idle)时间的一个子集,也就是说 iowait 其实可以归类到 idle 状态,本质上表示 CPU 是空闲的,只不过 iowait 表示任务中有等待 I/O 操作完成的时间。

    5fc1e5eaad64dba904928b443fad2c1f.png

    iowait 到底是什么意思呢?

    这样认为有一定的道理,毕竟哪怕 iowait 的数值是 100%,也仅仅是说明是 CPU 把时间都花在“等待”上了,这样的情况一般只有在当前系统没有其他任务需要使用 CPU 时才会发生。因为一旦有其他任务需要使用 CPU,Linux 内核会立刻将 CPU 提供给该任务使用,CPU 时间就不再全部是“等待I/O”花费的了(不再是 100% io 了)。

    不过读者应该明白的是,“idle”是 CPU 的状态,而 “iowait”则是任务的状态。对于单核 CPU 来说,同时只能有一个任务运行,上述说法可以认为是准确的。但是对于多核 CPU 来说,情况就有些不同了。

    例如,某个系统拥有 4 个 CPU,有一个 I/O 超密集型任务正在运行,那么,iowait 会是 100% 呢,还是 25% 呢?换句话说,iowait 会是在其中一个 CPU 上 100%,其他CPU 上 0% 呢,还是会在 4 个 CPU 上平均 25 % 呢?

    7ad88e4acfd2f8fcf376f747e2486331.png

    简单做一个实验

    简单做一个实验就可以了。我们使用 Linux 中的 dd 命令模拟高密集 I/O 任务,这一过程可以通过输入以下命令实现:

    dd if=/dev/sda of=/dev/null bs=1MB

    这条命令可能需要 root 权限,/dev/sda 是我的磁盘,读者可能需要换成自己的节点名。

    此时,通过 top 命令可以查看到下面这样的结果:

    2bc974814ccf9c888d11002c7cb0f608.png

    top 命令

    图中的 “wa”表示 I/O 等待时间(它和 io、iowait 是一个意思,名字不同而已)。可见,Linux 此时采用单个 CPU 处理 I/O 任务。如果读者细心的话,应该能够发现,I/O 任务只是偶尔的切换到其他 CPU 上运行,这是为了保证 CPU 缓冲的命中率,Linux 内核尽量让任务在单个 CPU 中运行。

    在其他一些系统中,I/O 任务可能会在各个CPU中频繁的切换,此时会产生下面这样的结果:

    4e00b10c5bb5617486d62db723753601.png

    I/O 任务可能会在各个CPU中频繁的切换

    假设 dd 命令是系统中执行 I/O 的唯一任务,那么在同一时刻,最多只会有一个 CPU 处理 I/O 等待任务。因此,实际上 34.8+20.9+26.7+3.7=86.1,接近但低于100。

    进一步实验

    为了让实验更可重现,我们可以使用 taskset 命令为任务指定 CPU:

    taskset 1 dd if=/dev/sda of=/dev/null bs=1MB

    应该注意,taskset 后的数字 1 并不是 CPU 的编号,而是一种掩码。

    此时通过 top 命令查看 CPU 使用请看,应该能够发现 CPU0 的 wa 项接近 100,这说明 CPU0 几乎所有的时间都花在等待 I/O 操作完成上。那么,是不是此时 CPU 就没有精力处理其他任务了呢?我们再输入下面这条命令:

    taskset 1 sh -c "while true; do true; done"

    上面这条命令是在相同的 CPU 上执行一个死循环,用于模拟计算密集型任务,它是不是就没有机会执行了呢?输入 top 命令,得到如下结果:

    b306791012989d0c14f5f34ec31d79ad.png

    CPU0 的 wa 降低为 0 了

    CPU0 的 wa 降低为 0 了,与此同时,用户态和系统态的 CPU 时间接近 100% 了。这是意料之中的,因为本质上 CPU 是空闲的,Linux 内核当然可以把 CPU 交给第二个任务使用。原本用于等待 I/O 完成的 CPU 时间,现在用于处理第二个任务了。此时通过 top 命令查看 wa,自然得到接近 0 的结果。

    小结

    现在基本就清楚 top 命令中 % io 的含义了:对于指定的 CPU 来说,iowait 表示在此时间内,CPU 其实是空闲的,不过 CPU 并不是严格意义上的“空闲”,毕竟它还需要等待 I/O 操作完成。对于产生 I/O 操作请求的线程来说,它会阻塞等待 I/O 操作完成。理解这一点,对于我们开发I/O操作密集的C语言程序是非常有帮助的。

    5afb6ad18e8ec8fe5a5c38dbd646ee9a.png

    点个赞再走吧

    欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦(最近发现有些帐号搬运我的文章并且标上原创标签,有些可耻,请注明出处!!)。

    展开全文
  • 虚假唤醒就是一些obj.wait()会在除了obj.notify()和obj....意思是还有其他方法能唤醒wait()方法? ![图片说明](https://img-ask.csdn.net/upload/201608/07/1470567754_909326.png) 为什么用while就能避免虚假唤醒呢?
  • 我看百度上说的虚假唤醒都说的不通过wait去唤醒线程才虚假唤醒,有没有具体的例子啊
  • 1. The function primarily used for this is pthread_cond_wait (). It takes two arguments; the first is a pointer to a condition variable, and the second is a locked mutex.函数pthreadcondwait()主要就是...
  • 作者简介:徐隆曦,滴滴出行高级工程师。本文选自:拉勾教育专栏《Java 并发编程 78 讲》你好,我是徐隆曦,今天我们主要探讨一个...我们先来看看 wait 方法的源码注释是怎么写的:上面这段英文的意思是说,在使用...
  • 可悲了,写了这么多年,第一次看到这个代码。 SELECT [owt].[session_id], [owt].[exec_context_... [owt].[wait_duration_ms], [owt].[wait_type], [owt].[blocking_session_id], [owt].[resource_des...
  • 水平触发:只要套接字可读/可写epollwait都会将描述符返回。即只要套接字的接收缓冲中尚有数据或发送缓冲有空间容纳要发送的数据。这个套接字都会被epoll_wait返回。边缘触发:当套接字的缓冲状态发生变化时返回。...
  • 双十一前的一个多月,所有的...我们发现有大量wait()相关的Exception,这个时候我们怀疑在多线程并发处理的时候,出现了大量的线程处理不及时导致的这些问题,后来我们通过减小线程池最大线程数,再进行压测发现系...
  • 今天有位同学过来问我下面代码中那个super.wait()是什么意思? public synchronized void waitAvailable() { try { if (num == "wait") super.wait(); } catch (InterruptedException ex) { } } 那...
  • 我们知道, 在tcp四次挥手中, 主动关闭的一端发FIN包后, 进入FIN_WAIT1状态, 什么意思呢? 也就是在等在FIN的ACK回包。  在极端情况下, 如果主动关闭端的发送缓冲区满了, 发送端直接杀进程, 发FIN包, 那么...
  • ACM中AC、WA、PE、RE分别是什么意思

    千次阅读 2019-10-12 00:16:55
    英文原版(下面有翻译) Queuing: The judge is so busy that it can't judge your ... Usually you just need to wait a while because our judge server is powered by IBM and Intel Xeon :-) Compilin...
  • 12-TCP 协议(TIME_WAIT 状态)

    千次阅读 2017-04-08 17:56:37
    如果你仔细研究了 TCP 四次挥手,你会发现主动关闭一方最后的状态是 TIME_WAIT,这个 TIME_WAIT 状态是什么意思呢? 图1 仔细观察主动关闭一方最后的状态 1. TIME_WAIT 状态TIME_WAIT 状态,又称为 2MSL 等待...
  • 示例一#include int find(int *a);...int wait, test;test = find(&b);printf("内存地址为:%d",&test);scanf("%d", &wait);}int find(int *a){return *a;}int b = 1; int test = find(&b); 这样...
  • top命令的load average是什么意思

    千次阅读 2011-08-28 18:54:29
    系统平均负载被定义为在特定时间间隔内运行队列中的平均进程树。 如果一个进程满足以下条件则其就会位于运行队列...- 它没有主动进入等待状态(也就是没有调用'wait')  - 没有被停止(例如:等待终止)  例如: [ro
  • 等号上面这段大多数网上给pthread_cond_wait()加一个while为什么的解释:但是有些地方不太明白或者说没有解释清晰: 准备:1:pthread_cond_singal唤醒至少一个线程的(而不是sinal的意思,仅仅唤醒一个线程)...
  • 双十一前的一个多月,所有的...我们发现有大量wait()相关的Exception,这个时候我们怀疑在多线程并发处理的时候,出现了大量的线程处理不及时导致的这些问题,后来我们通过减小线程池最大线程数,再进行压测发现系...
  • // 判断是否logout注销,退出 boolean isLogout = app.userPreferenceHandler.getBoolean(Setting.sp_is_logout, true); if (isLogout) { // 登录页面 new Handler().postDelayed(new Runnable() { ...
  • 输入 top 命令,的确可以看到一系列 cpu 使用率,其中一个值得注意的子项就是 io 使用率了,如下图:top 命令上图中 io 前面的数字是什么意思呢?是指 CPU 有 63% 的时间花费在 io 上了吗?在 Linux 中输入 man 命令...
  • 具体每种状态什么意思,其实无需多说,看看下面这种图就明白了,注意这里提到的服务器应该业务请求接受处理的一方:这么多状态不用都记住,只要了解到我上面提到的最常见的三种状态的意义就...
  • 符号的意思就是函数的入口地址,或者说把这些符号和对应的地址保存起来的,在内核运行的过程中,可以找到这些符号对应的地址的。 在1.c里面定义了一个 EXPORT_SYMBOL(input_allocate_device); 在2.c的驱动文件...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 212
精华内容 84
关键字:

wait意思是什么