-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtcp-time-wait.html
executable file
·391 lines (278 loc) · 18.9 KB
/
tcp-time-wait.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
<!DOCTYPE HTML>
<html>
<head><meta name="generator" content="Hexo 3.9.0">
<meta charset="UTF-8">
<title>tcp time wait | 为什么这么涛的个人博客</title>
<meta name="viewport" content="width=device-width, initial-scale=1,user-scalable=no">
<meta name="author" content="为什么这么涛">
<meta name="description" content="什么是 TCP 连接TCP 为什么需要 TIME-WAIT维持 TCP 连接理论上不占用网络资源(会占用两头程序的系统资源) 页表的作用 由于每个进程都有3G的私有进程空间,所以系统的物理内存无法对这些地址空间进行一一映射,因此kernel需要一种机制,把进程地址空间映射到物理内存上。当一个进程请求访问内存时,操作系统通过存储在kernel中的进程页表把这个虚拟地址映射到物理地址,如果还没有为这个">
<meta property="og:type" content="website">
<meta property="og:title" content="tcp time wait">
<meta property="og:url" content="https://scoolor.github.io/tcp-time-wait.html">
<meta property="og:site_name" content="为什么这么涛的个人博客">
<meta property="og:description" content="什么是 TCP 连接TCP 为什么需要 TIME-WAIT维持 TCP 连接理论上不占用网络资源(会占用两头程序的系统资源) 页表的作用 由于每个进程都有3G的私有进程空间,所以系统的物理内存无法对这些地址空间进行一一映射,因此kernel需要一种机制,把进程地址空间映射到物理内存上。当一个进程请求访问内存时,操作系统通过存储在kernel中的进程页表把这个虚拟地址映射到物理地址,如果还没有为这个">
<meta property="og:locale" content="default">
<meta property="og:updated_time" content="2019-01-01T16:17:07.410Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="tcp time wait">
<meta name="twitter:description" content="什么是 TCP 连接TCP 为什么需要 TIME-WAIT维持 TCP 连接理论上不占用网络资源(会占用两头程序的系统资源) 页表的作用 由于每个进程都有3G的私有进程空间,所以系统的物理内存无法对这些地址空间进行一一映射,因此kernel需要一种机制,把进程地址空间映射到物理内存上。当一个进程请求访问内存时,操作系统通过存储在kernel中的进程页表把这个虚拟地址映射到物理地址,如果还没有为这个">
<link rel="alternative" href="/atom.xml" title="为什么这么涛的个人博客" type="application/atom+xml">
<link rel="icon" href="/img/favicon.ico">
<link rel="apple-touch-icon" href="/img/jacman.png">
<link rel="apple-touch-icon-precomposed" href="/img/jacman.png">
<link rel="stylesheet" href="/css/style.css">
</head>
</html>
<body>
<header>
<div>
<div id="textlogo">
<h1 class="site-name"><a href="/" title="为什么这么涛的个人博客">为什么这么涛的个人博客</a></h1>
<h2 class="blog-motto">做一件事最好的时机是十年前,其次就是现在</h2>
</div>
<div class="navbar"><a class="navbutton navmobile" href="#" title="Menu">
</a></div>
<nav class="animated">
<ul>
<ul>
<li><a href="/">Home</a></li>
<li><a href="/archives">Archives</a></li>
<li><a href="/about">About</a></li>
<li>
<form class="search" action="//google.com/search" method="get" accept-charset="utf-8">
<label>Search</label>
<input type="search" id="search" name="q" autocomplete="off" maxlength="20" placeholder="Search" />
<input type="hidden" name="q" value="site:scoolor.github.io">
</form>
</li>
</ul>
</nav>
</div>
</header>
<div id="container">
<div id="main" class="page" itemscope itemprop="blogPost">
<article itemprop="articleBody">
<header class="article-info clearfix">
<h1 itemprop="name">
<a href="/tcp-time-wait.html" title="tcp time wait" itemprop="url">tcp time wait</a>
</h1>
<p class="article-author">By
<a href="/about" title="为什么这么涛" target="_blank" itemprop="author">为什么这么涛</a>
<p class="article-time">
<time datetime="2018-12-30T05:13:41.000Z" itemprop="datePublished"> Published 2018-12-30</time>
</p>
</header>
<div class="article-content">
<h2 id="什么是-TCP-连接"><a href="#什么是-TCP-连接" class="headerlink" title="什么是 TCP 连接"></a>什么是 TCP 连接</h2><p>TCP</p>
<h2 id="为什么需要-TIME-WAIT"><a href="#为什么需要-TIME-WAIT" class="headerlink" title="为什么需要 TIME-WAIT"></a>为什么需要 TIME-WAIT</h2><p>维持 TCP 连接理论上不占用网络资源(会占用两头程序的系统资源)</p>
<p>页表的作用</p>
<p>由于每个进程都有3G的私有进程空间,所以系统的物理内存无法对这些地址空间进行一一映射,因此kernel需要一种机制,把进程地址空间映射到物理内存上。当一个进程请求访问内存时,操作系统通过存储在kernel中的进程页表把这个虚拟地址映射到物理地址,如果还没有为这个地址建立页表项,那么操作系统就为这个访问的地址建立页表项。最基本的映射单位是page,对应的是页表项PTE</p>
<p>页表项和物理地址是多对一的关系,即多个页表项可以对应一个物理页面,因而支持共享内存的实现(几个进程同时共享物理内存)。</p>
<p>用户态和内核态切换</p>
<p>上下文切换的性能消耗在哪里呢?</p>
<pre><code> context switch过高,会导致CPU像个搬运工,频繁在寄存器和运行队列直接奔波 ,更多的时间花在了线程切换,而不是真正工作的线程上。直接的消耗包括CPU寄存器需要保存和加载,系统调度器的代码需要执行。间接消耗在于多核cache之间的共享数据。
引起上下文切换的原因有哪些?
对于抢占式操作系统而言, 大体有几种:
1、当前任务的时间片用完之后,系统CPU正常调度下一个任务;
2、当前任务碰到IO阻塞,调度线程将挂起此任务,继续下一个任务;
3、多个任务抢占锁资源,当前任务没有抢到,被调度器挂起,继续下一个任务;
4、用户代码挂起当前任务,让出CPU时间;
5、硬件中断;</code></pre><p>Load这个东西确实表现为当前有多少个线程在等待运行,最优的值是你的核数(或者超线程数)</p>
<p>Interrupt Rate包括内核由于进程的时间片中断。(在 Linux 2.6 中,系统时钟每 1 毫秒中断一次时钟频率,用 HZ 宏表示,定义为 1000,即每秒中断 1000 次。系统不一样,内核不一样配置100、250的都有。)</p>
<p>内核的时钟频率可以通过如下命令知道</p>
<p>cat /boot/config-<code>uname -r</code> | grep ‘^CONFIG_HZ=’</p>
<p>CONFIG_HZ=100</p>
<p>每秒总的时钟中断数就是 = cpu个数 * 核数 * CONFIG_HZ</p>
<h2 id="系统调用的机制,其核心还是使用了操作系统为用户特别开放的一个中断来实现"><a href="#系统调用的机制,其核心还是使用了操作系统为用户特别开放的一个中断来实现" class="headerlink" title="系统调用的机制,其核心还是使用了操作系统为用户特别开放的一个中断来实现"></a>系统调用的机制,其核心还是使用了操作系统为用户特别开放的一个中断来实现</h2><p>pidstat监控指定进程的Context Switch上下文切换:</p>
<p>首先安装sysstat:yum install sysstat //使用的是fedora,ubuntu/debian使用apg-get</p>
<p>pidstat -w -G testp 1 10 //根据进程名监控上下文切换<br>pidstat -w -p 48863 1 10 //根据PID监控上下文切换</p>
<p>平均时间: UID PID cswch/s nvcswch/s Command<br>平均时间: 0 48770 2.53 2.78 testp</p>
<p>cswch/s: 每秒任务主动(自愿的)切换上下文的次数,当某一任务处于阻塞等待时,将主动让出自己的CPU资源。</p>
<p>nvcswch/s: 每秒任务被动(不自愿的)切换上下文的次数,CPU分配给某一任务的时间片已经用完,因此将强迫该进程让出CPU的执行权。</p>
<p>性能评估主要对CPU、memory、disk IO和network IO四个指标,从带宽和时延两个角度评估。</p>
<p>所谓带宽,不仅仅是硬件上的读写速度,而是数据从源头到达CPU,然后CPU将其送往目的地的速度,考验的是传输能力;所谓时延,更多的评估传输的效率,读取一定量的数据,数据可以在多长时间内从内存读取到CPU。</p>
<p>所谓时延,其实也是另一种意义的速度,比如context switch,并没有吞吐量这个概念,但是通过将多个进程切换N次,得到总体时间,平均后可以获得单次切换用时,用以评估context switch的latency。</p>
<p>context switch(上下文切换)对于CPU的load影响非常大。在将线程数减为之前的1/3时,load居然降到之前的1/5。通常导致context switch(上下文切换)的主要原因是应用程序启动的线程过多。</p>
<p>多线程 vs 多进程 切换的成本<br>多线程之间堆内存共享,而进程相互独立,线程间通信可以直接基于共享内存来实现,比进程的常用的那些多进程通信方式更轻量。<br>在上下文切换来说,不管是多线程还是都进程都涉及到寄存器、栈的保存,但是线程不需要切换 页面映射(虚拟内存空间)、文件描述符等,所以线程的上下文切换也比多进程轻量<br>多进程比多线程更安全,一个进程基本上不会影响另外一个进程<br>在实际的开发中,一般不同任务间(可以把一个线程、进程叫做一个任务)需要通信,使用多线程的场景比多进程多。但是多进程有更高的容错性,一个进程的crash不会导致整个系统的崩溃,在任务安全性较高的情况下,采用多进程。</p>
<p>进程的概念<br>为了实现多任务系统,现代操作系统提出了进程的概念,在linux系统初期,进程作为 CPU 调度的基本单位,后来由于操作系统普遍引入了线程的概念,线程成为了CPU调度的基本单位,而进程只能作为资源拥有的基本单位</p>
<p>Load Average < CPU个数 * 核数 * 0.7</p>
<p>比如1个1核CPU,Load Average < 1 * 1 * 0.7;1个4核的CPU,Load Average必须 < 1 * 4 * 0.7 = 2.8。</p>
<p>压力测试衡量CPU的三个指标:CPU Utilization、Load Average和Context Switch Rate</p>
<h3 id="上下文切换性能影响:"><a href="#上下文切换性能影响:" class="headerlink" title="上下文切换性能影响:"></a>上下文切换性能影响:</h3><p>中断和进程(包括线程)切换,一次中断(Interrupt)会引起一次切换,进程(线程)的创建、激活之类的也会引起一次切换。CS的值也和TPS(Transaction Per Second)相关的,假设每次调用会引起N次CS,那么就可以得出</p>
<p>Context Switch Rate = Interrupt Rate + TPS * N</p>
<p>CSR减掉IR,就是进程/线程的切换,假如主进程收到请求交给线程处理,线程处理完毕归还给主进程,这里就是2次切换。也可以用CSR、IR、TPS的值代入公式中,得出每次事物导致的切换数。因此,要降低CSR,就必须在每个TPS引起的切换上下功夫,只有N这个值降下去,CSR就能降低,理想情况下N=0,但是无论如何如果N >= 4,则要好好检查检查。</p>
<p>Interrupt Rate包括内核由于进程的时间片中断。(在 Linux 2.6 中,系统时钟每 1 毫秒中断一次时钟频率,用 HZ 宏表示,定义为 1000,即每秒中断 1000 次。系统不一样,内核不一样配置100、250的都有。)</p>
<p>内核的时钟频率可以通过如下命令知道</p>
<p>cat /boot/config-<code>uname -r</code> | grep ‘^CONFIG_HZ=’</p>
<p>CONFIG_HZ=100</p>
<p>每秒总的时钟中断数就是 = cpu个数 * 核数 * CONFIG_HZ</p>
<p>cat /proc/interrupts</p>
<pre><code>CPU0 CPU1 CPU2 CPU3 </code></pre><p>LOC: 97574747 52361843 105207680 69447653 Local timer interrupts<br>RES: 107368 257510 98635 186294 Rescheduling interrupts<br>CAL: 14174 14206 14164 194 function call interrupts<br>TLB: 1007949 853117 992546 591410 TLB shootdowns</p>
</div>
<footer class="article-footer clearfix">
<div class="article-catetags">
</div>
<div class="article-share" id="share">
<div data-url="https://scoolor.github.io/tcp-time-wait.html" data-title="tcp time wait | 为什么这么涛的个人博客" data-tsina="" class="share clearfix">
</div>
</div>
</footer>
</article>
</div>
</div>
<footer><div id="footer" >
<div class="line">
<span></span>
<div class="author"></div>
</div>
<section class="info">
<p> Hello, I'm Scoolor, a coder. <br/>
This is my blog, just do it!</p>
</section>
<div class="social-font" class="clearfix">
<a href="https://github.com/scoolor" target="_blank" class="icon-github" title="github"></a>
<a href="http://www.zhihu.com/people/mu-yi-xiao-jiang" target="_blank" class="icon-zhihu" title="知乎"></a>
<a href="mailto:[email protected]" target="_blank" class="icon-email" title="Email Me"></a>
</div>
<p class="copyright">
Powered by <a href="http://hexo.io" target="_blank" title="hexo">hexo</a> and Theme by <a href="https://github.com/wuchong/jacman" target="_blank" title="Jacman">Jacman</a> © 2020
<a href="/about" target="_blank" title="为什么这么涛">为什么这么涛</a>
</p>
</div>
</footer>
<script src="/js/jquery-2.0.3.min.js"></script>
<script src="/js/jquery.imagesloaded.min.js"></script>
<script src="/js/gallery.js"></script>
<script src="/js/jquery.qrcode-0.12.0.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$('.navbar').click(function(){
$('header nav').toggleClass('shownav');
});
var myWidth = 0;
function getSize(){
if( typeof( window.innerWidth ) == 'number' ) {
myWidth = window.innerWidth;
} else if( document.documentElement && document.documentElement.clientWidth) {
myWidth = document.documentElement.clientWidth;
};
};
var m = $('#main'),
a = $('#asidepart'),
c = $('.closeaside'),
o = $('.openaside');
c.click(function(){
a.addClass('fadeOut').css('display', 'none');
o.css('display', 'block').addClass('fadeIn');
m.addClass('moveMain');
});
o.click(function(){
o.css('display', 'none').removeClass('beforeFadeIn');
a.css('display', 'block').removeClass('fadeOut').addClass('fadeIn');
m.removeClass('moveMain');
});
$(window).scroll(function(){
o.css("top",Math.max(80,260-$(this).scrollTop()));
});
$(window).resize(function(){
getSize();
if (myWidth >= 1024) {
$('header nav').removeClass('shownav');
}else{
m.removeClass('moveMain');
a.css('display', 'block').removeClass('fadeOut');
o.css('display', 'none');
}
});
});
</script>
<script type="text/javascript">
$(document).ready(function(){
var $this = $('.share'),
url = $this.attr('data-url'),
encodedUrl = encodeURIComponent(url),
title = $this.attr('data-title'),
tsina = $this.attr('data-tsina'),
description = $this.attr('description');
var html = [
'<div class="hoverqrcode clearfix"></div>',
'<a class="overlay" id="qrcode"></a>',
'<a href="https://www.facebook.com/sharer.php?u=' + encodedUrl + '" class="article-share-facebook" target="_blank" title="Facebook"></a>',
'<a href="https://twitter.com/intent/tweet?url=' + encodedUrl + '" class="article-share-twitter" target="_blank" title="Twitter"></a>',
'<a href="#qrcode" class="article-share-qrcode" title="微信"></a>',
'<a href="http://widget.renren.com/dialog/share?resourceUrl=' + encodedUrl + '&srcUrl=' + encodedUrl + '&title=' + title +'" class="article-share-renren" target="_blank" title="人人"></a>',
'<a href="http://service.weibo.com/share/share.php?title='+title+'&url='+encodedUrl +'&ralateUid='+ tsina +'&searchPic=true&style=number' +'" class="article-share-weibo" target="_blank" title="微博"></a>',
'<span title="Share to"></span>'
].join('');
$this.append(html);
$('.hoverqrcode').hide();
var myWidth = 0;
function updatehoverqrcode(){
if( typeof( window.innerWidth ) == 'number' ) {
myWidth = window.innerWidth;
} else if( document.documentElement && document.documentElement.clientWidth) {
myWidth = document.documentElement.clientWidth;
};
var qrsize = myWidth > 1024 ? 200:100;
var options = {render: 'image', size: qrsize, fill: '#2ca6cb', text: url, radius: 0.5, quiet: 1};
var p = $('.article-share-qrcode').position();
$('.hoverqrcode').empty().css('width', qrsize).css('height', qrsize)
.css('left', p.left-qrsize/2+20).css('top', p.top-qrsize-10)
.qrcode(options);
};
$(window).resize(function(){
$('.hoverqrcode').hide();
});
$('.article-share-qrcode').click(function(){
updatehoverqrcode();
$('.hoverqrcode').toggle();
});
$('.article-share-qrcode').hover(function(){}, function(){
$('.hoverqrcode').hide();
});
});
</script>
<link rel="stylesheet" href="/fancybox/jquery.fancybox.css" media="screen" type="text/css">
<script src="/fancybox/jquery.fancybox.pack.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$('.article-content').each(function(i){
$(this).find('img').each(function(){
if ($(this).parent().hasClass('fancybox')) return;
var alt = this.alt;
if (alt) $(this).after('<span class="caption">' + alt + '</span>');
$(this).wrap('<a href="' + this.src + '" title="' + alt + '" class="fancybox"></a>');
});
$(this).find('.fancybox').each(function(){
$(this).attr('rel', 'article' + i);
});
});
if($.fancybox){
$('.fancybox').fancybox();
}
});
</script>
<!-- Analytics Begin -->
<script type="text/javascript">
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-92081918-2', 'scoolor.github.io');
ga('send', 'pageview');
</script>
<!-- Analytics End -->
<!-- Totop Begin -->
<div id="totop">
<a title="Back to Top"><img src="/img/scrollup.png"/></a>
</div>
<script src="/js/totop.js"></script>
<!-- Totop End -->
<!-- MathJax Begin -->
<!-- mathjax config similar to math.stackexchange -->
<!-- MathJax End -->
<!-- Tiny_search Begin -->
<!-- Tiny_search End -->
</body>
</html>