-
Notifications
You must be signed in to change notification settings - Fork 0
/
hou-duan-fu-wu-xing-neng-diao-you.html
316 lines (270 loc) · 19 KB
/
hou-duan-fu-wu-xing-neng-diao-you.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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="CatsAction" />
<meta property="og:type" content="article" />
<meta name="twitter:card" content="summary">
<meta name="keywords" content="自动化运维, Linux, 性能优化, " />
<meta property="og:title" content="后端服务性能调优 - 因素,测试及思路"/>
<meta property="og:url" content="./hou-duan-fu-wu-xing-neng-diao-you.html" />
<meta property="og:description" content="一个好的网站,不仅仅是实现了功能,还应该有良好的性能。包括高可用,极端情况断电,自然灾害,部分服务器挂掉的情况不影响正常提供服务。还包括大并发的支持,面对上千万的访问量还能还能正常提供服务。当然,很多网站不会面对这样大的访问量,但是追求大并发,高流量下的性能,应该成为每个开发人员努力的方向。 性能参考 单机性能 CPU:有的应用需要大量计算,他们会长时间、不间断地占用 CPU 资源,导致其他资源无法争夺到 CPU 而响应缓慢,从而带来系统性能问题。例如,代码递归导致的无限循环,正则表达式引起的回溯,以及多线程编程造成的大量上下文切换等,这些都有可能导致 CPU 资源繁忙。 内存:读写速度很快,但是成本过高。内存泄露,过多的全局变量等内存开销,可能耗尽内存,从而影响服务正常运行。 磁盘IO:磁盘存储空间比内存大,但是速度比内存慢。过多的IO操作会降级服务的性能。 网络:网络是互联网的经脉,是否畅通高效直接影响服务性能。 数据库:大部分系统都会用到数据库,而数据库的操作往往是涉及到磁盘 …" />
<meta property="og:site_name" content="CatsAction's blog" />
<meta property="og:article:author" content="CatsAction" />
<meta property="og:article:published_time" content="2017-05-22T00:00:00+08:00" />
<meta name="twitter:title" content="后端服务性能调优 - 因素,测试及思路">
<meta name="twitter:description" content="一个好的网站,不仅仅是实现了功能,还应该有良好的性能。包括高可用,极端情况断电,自然灾害,部分服务器挂掉的情况不影响正常提供服务。还包括大并发的支持,面对上千万的访问量还能还能正常提供服务。当然,很多网站不会面对这样大的访问量,但是追求大并发,高流量下的性能,应该成为每个开发人员努力的方向。 性能参考 单机性能 CPU:有的应用需要大量计算,他们会长时间、不间断地占用 CPU 资源,导致其他资源无法争夺到 CPU 而响应缓慢,从而带来系统性能问题。例如,代码递归导致的无限循环,正则表达式引起的回溯,以及多线程编程造成的大量上下文切换等,这些都有可能导致 CPU 资源繁忙。 内存:读写速度很快,但是成本过高。内存泄露,过多的全局变量等内存开销,可能耗尽内存,从而影响服务正常运行。 磁盘IO:磁盘存储空间比内存大,但是速度比内存慢。过多的IO操作会降级服务的性能。 网络:网络是互联网的经脉,是否畅通高效直接影响服务性能。 数据库:大部分系统都会用到数据库,而数据库的操作往往是涉及到磁盘 …">
<title>后端服务性能调优 - 因素,测试及思路 ·
CatsAction's blog
</title>
<link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css" rel="stylesheet">
<link rel="icon" type="image/x-icon" href="./theme/image/logo.ico" />
<link rel="stylesheet" type="text/css" href="./theme/css/elegant.prod.css" media="screen">
<link rel="stylesheet" type="text/css" href="./theme/css/custom.css" media="screen">
</head>
<body>
<div id="content">
<div class="navbar navbar-static-top">
<div class="navbar-inner">
<div class="container-fluid">
<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</a>
<a class="brand" href="./"><span class=site-name>CatsAction's blog</span></a>
<div class="nav-collapse collapse">
<ul class="nav pull-right top-menu">
<li >
<a href=
.
>Home</a>
</li>
<li ><a href="./categories.html">Categories</a></li>
<li ><a href="./tags.html">Tags</a></li>
<li ><a href="./archives.html">Archives</a></li>
<li><form class="navbar-search" action="./search.html" onsubmit="return validateForm(this.elements['q'].value);"> <input type="text" class="search-query" placeholder="Search" name="q" id="tipue_search_input"></form></li>
</ul>
</div>
</div>
</div>
</div>
<div class="container-fluid">
<div class="row-fluid">
<div class="span1"></div>
<div class="span10">
<article itemscope>
<div class="row-fluid">
<header class="page-header span10 offset2">
<h1>
<a href="./hou-duan-fu-wu-xing-neng-diao-you.html">
后端服务性能调优
<small class="subtitle">
因素,测试及思路
</small>
</a>
</h1>
</header>
</div>
<div class="row-fluid">
<div class="span8 offset2 article-content">
<p>一个好的网站,不仅仅是实现了功能,还应该有良好的性能。包括高可用,极端情况断电,自然灾害,部分服务器挂掉的情况不影响正常提供服务。还包括大并发的支持,面对上千万的访问量还能还能正常提供服务。当然,很多网站不会面对这样大的访问量,但是追求大并发,高流量下的性能,应该成为每个开发人员努力的方向。</p>
<h2>性能参考</h2>
<h6>单机性能</h6>
<ul>
<li>
<p>CPU:有的应用需要大量计算,他们会长时间、不间断地占用 CPU 资源,导致其他资源无法争夺到 CPU 而响应缓慢,从而带来系统性能问题。例如,代码递归导致的无限循环,正则表达式引起的回溯,以及多线程编程造成的大量上下文切换等,这些都有可能导致 CPU 资源繁忙。</p>
</li>
<li>
<p>内存:读写速度很快,但是成本过高。内存泄露,过多的全局变量等内存开销,可能耗尽内存,从而影响服务正常运行。</p>
</li>
<li>
<p>磁盘IO:磁盘存储空间比内存大,但是速度比内存慢。过多的IO操作会降级服务的性能。</p>
</li>
<li>
<p>网络:网络是互联网的经脉,是否畅通高效直接影响服务性能。</p>
</li>
<li>
<p>数据库:大部分系统都会用到数据库,而数据库的操作往往是涉及到磁盘 I/O 的读写。大量的数据库读写操作,会导致磁盘 I/O 性能瓶颈,进而导致数据库操作的延迟性。对于有大量数据库读写操作的系统来说,数据库的性能优化是整个系统的核心。</p>
</li>
<li>
<p>代码实现的强壮型:如果代码在边际条件出现异常,将影响服务的正常服务。</p>
</li>
<li>
<p>算法及锁。高效的算法,对大运算程序影响很显著。并发编程共享读写同一资源会用到锁,锁的使用可能会带来上下文切换,从而给系统带来性能开销。</p>
</li>
</ul>
<h6>集群性能</h6>
<p>我们上面提到单机的性能标准,无外乎CPU,内存,IO的平均负载情况。当有上千万的并发访问量时,一台主机无能如何是扛不住的,因此就会用到集群。集群利用负载均衡,有效的减轻了单机负载压力。集群应该考虑好高可用和数据同步的问题。</p>
<ul>
<li>
<p>高可用:当有部分服务器出现问题,不应该影响提供完整功能服务。常见的高可用方案有Nginx,HaProxy。</p>
</li>
<li>
<p>数据同步:集群方案中,数据库不是存储在一台主机上。这样可以保证数据的安全,当一台数据库主机出现故障时,可以利用另一台恢复。数据库同步可以主从同步,但这个情况会出现从服务器和主服务器数据不一致的时间延迟。可以用写同步解决主从同步的问题,但是写同步要多台数据库写完才返回,造成数据库吞吐率下降。</p>
</li>
<li>
<p>认证和授权:如何保证集群的服务一个认证入口。一次授权,所有的集群主机都能授权。而且保证独立访问单机时,认证授权不被绕过。</p>
</li>
<li>
<p>网络安全:集群主机之间通信的安全。这个单机也需要考虑。</p>
</li>
</ul>
<h2>性能测试指标</h2>
<ul>
<li>
<p>响应时间:响应时间分数据库响应时间,服务端响应时间,网络响应时间,客户端响应时间(JS执行逻辑,渲染等)</p>
</li>
<li>
<p>吞吐量:在测试中,我们往往会比较注重系统接口的 TPS(每秒事务处理量)。TPS分为磁盘TPS和网络TPS。网络TPS不仅仅跟带宽有关系,还跟 CPU 的处理能力、网卡、防火墙、外部接口以及 I/O 等等紧密关联。</p>
</li>
<li>
<p>计算机资源分配使用率:通常由 CPU 占用率、内存使用率、磁盘 I/O、网络 I/O 来表示资源使用率。这几个参数好比一个木桶,如果其中任何一块木板出现短板,任何一项分配不合理,对整个系统性能的影响都是毁灭性的。</p>
</li>
<li>
<p>负载承受能力:当系统压力上升时,你可以观察,系统响应时间的上升曲线是否平缓。这项指标能直观地反馈给你,系统所能承受的负载压力极限。例如,当你对系统进行压测时,系统的响应时间会随着系统并发数的增加而延长,直到系统无法处理这么多请求,抛出大量错误时,就到了极限。</p>
</li>
</ul>
<h2>一些检测手段</h2>
<p>1,查看系统平均负载</p>
<p>在Linux和类Unix系统中,我们可以通过<code>w</code>或<code>uptime</code>查看系统平均负载,下面是MacOS执行<code>uptime</code>命令的结果,后面三个数表示系统1分钟,5分钟,10分钟的平均负载。</p>
<div class="highlight"><pre><span></span><span class="m">16</span>:45 up <span class="m">7</span>:26, <span class="m">2</span> users, load averages: <span class="m">2</span>.07 <span class="m">1</span>.94 <span class="m">2</span>.06
</pre></div>
<p>2,查看CPU和内存情况。</p>
<p>可用用<code>cat /proc/cpuinfo</code>查看单机的CPU信息,用<code>free -m</code>查看内存使用情况。<code>top</code>命令是Linux监控命令,可以看到CPU,内存,虚拟内存,网络吞吐量,磁盘IO,进程调度情况。</p>
<p>3,硬盘及IO监控</p>
<p>通过<code>df -hl</code>查看磁盘使用情况,<code>du</code>命令查看目录占用磁盘情况。<code>iostat</code>可以监控IO负载情况。下面是MacOS下<code>iostat</code>输出。</p>
<div class="highlight"><pre><span></span> disk0 disk2 cpu load average
KB/t tps MB/s KB/t tps MB/s us sy id 1m 5m 15m
<span class="m">89</span>.54 <span class="m">183</span> <span class="m">15</span>.98 <span class="m">26</span>.48 <span class="m">0</span> <span class="m">0</span>.00 <span class="m">14</span> <span class="m">7</span> <span class="m">79</span> <span class="m">2</span>.12 <span class="m">2</span>.21 <span class="m">2</span>.17
</pre></div>
<p>4,网络响应时间</p>
<p>可以通过工具<code>speedtest</code>测试。<code>curl</code>命令加<code>-w</code>可以查看很详细的响应时间。</p>
<div class="highlight"><pre><span></span><span class="o">(</span>.venv<span class="o">)</span> xufan in ~/CatsAction on master ● ● ● λ curl -w <span class="s2">"%{time_namelookup}::%{time_connect}::%{time_starttransfer}::%{time_total}::%{speed_download}"</span> www.baidu.com
......
......
<span class="m">0</span>.012914::0.020047::0.026661::0.026903::91576.000%
</pre></div>
<h2>一些思路</h2>
<ul>
<li>不要过早优化,前期应该从软件工程的角度去开发。有性能拼劲的时候才着手优化。</li>
<li>不要想着简单扩容内存提升性能,也有很多IO操作设计到磁盘和网络,具体情况具体分析。</li>
<li>性能分析过早分析底层。应该着眼全局,从应用层,网络,IO,然后才是一些核心参数和算法。</li>
</ul>
<hr />
<aside>
<nav>
<ul class="articles-timeline">
<li class="previous-article">« <a href="./httptou-bu-zhi-shi.html"
title="Previous: HTTP头部知识">HTTP头部知识</a></li>
<li class="next-article"><a href="./pythonyi-bu-bian-cheng-xiang-jie.html"
title="Next: Python异步编程详解">Python异步编程详解</a> »</li>
</ul>
</nav>
</aside>
</div>
<section id="article-sidebar" class="span2">
<h4>Published</h4>
<time itemprop="dateCreated" datetime="2017-05-22T00:00:00+08:00"> 5
22, 2017</time>
<!---->
<h4>Category</h4>
<a class="category-link"
href="./categories.html#xing-neng-you-hua-ref">性能优化</a>
<h4>Tags</h4>
<ul class="list-of-tags tags-in-article">
<li><a href="./tags.html#linux-ref">Linux
<span>2</span>
</a></li>
<li><a href="./tags.html#zi-dong-hua-yun-wei-ref">自动化运维
<span>2</span>
</a></li>
</ul>
<h4>Stay in Touch</h4>
<div id="sidebar-social-link">
<a href="mailto:[email protected]" title="My Email Address" target="_blank" rel="nofollow noopener noreferrer">
<svg xmlns="http://www.w3.org/2000/svg" aria-label="Mail" role="img" viewBox="0 0 512 512"><rect width="512" height="512" rx="15%" fill="#328cff"/><path d="m250 186c-46 0-69 35-69 74 0 44 29 72 68 72 43 0 73-32 73-75 0-44-34-71-72-71zm-1-37c30 0 57 13 77 33 0-22 35-22 35 1v150c-1 10 10 16 16 9 25-25 54-128-14-187-64-56-149-47-195-15-48 33-79 107-49 175 33 76 126 99 182 76 28-12 41 26 12 39-45 19-168 17-225-82-38-68-36-185 67-248 78-46 182-33 244 32 66 69 62 197-2 246-28 23-71 1-71-32v-11c-20 20-47 32-77 32-57 0-108-51-108-108 0-58 51-110 108-110" fill="#fff"/></svg>
</a>
<a href="https://github.com/boyaziqi" title="catsaction Github Repository" target="_blank" rel="nofollow noopener noreferrer">
<svg xmlns="http://www.w3.org/2000/svg" aria-label="GitHub" role="img" viewBox="0 0 512 512"><rect width="512" height="512" rx="15%" fill="#1B1817"/><path fill="#fff" d="M335 499c14 0 12 17 12 17H165s-2-17 12-17c13 0 16-6 16-12l-1-50c-71 16-86-28-86-28-12-30-28-37-28-37-24-16 1-16 1-16 26 2 40 26 40 26 22 39 59 28 74 22 2-17 9-28 16-35-57-6-116-28-116-126 0-28 10-51 26-69-3-6-11-32 3-67 0 0 21-7 70 26 42-12 86-12 128 0 49-33 70-26 70-26 14 35 6 61 3 67 16 18 26 41 26 69 0 98-60 120-117 126 10 8 18 24 18 48l-1 70c0 6 3 12 16 12z"/></svg>
</a>
<a href="https://www.linkedin.com/feed/" title="My LinkedIn" target="_blank" rel="nofollow noopener noreferrer">
<svg xmlns="http://www.w3.org/2000/svg" aria-label="LinkedIn" role="img" viewBox="0 0 512 512" fill="#fff"><rect width="512" height="512" rx="15%" fill="#0077b5"/><circle cx="142" cy="138" r="37"/><path stroke="#fff" stroke-width="66" d="M244 194v198M142 194v198"/><path d="M276 282c0-20 13-40 36-40 24 0 33 18 33 45v105h66V279c0-61-32-89-76-89-34 0-51 19-59 32"/></svg>
</a>
</div>
<h4>Friendship Links</h4>
<ul class="list-of-tags tags-in-article">
<li>
<a href="https://leetcode-cn.com/" title="力扣中国站点" target="_blank" rel="nofollow noopener noreferrer">
LeetCode
</a>
</li>
<li>
<a href="https://coolshell.cn/about" title="陈皓酷壳" target="_blank" rel="nofollow noopener noreferrer">
CoolShell
</a>
</li>
<li>
<a href="https://yikun.github.io/" title="姜毅坤博客" target="_blank" rel="nofollow noopener noreferrer">
Yikun
</a>
</li>
<li>
<a href="https://www.nowcoder.com/" title="牛客网" target="_blank" rel="nofollow noopener noreferrer">
牛客网
</a>
</li>
</ul>
</section>
</div>
</article>
</div>
<div class="span1"></div>
</div>
</div>
</div>
<footer>
<div>
<span class="site-name">CatsAction's blog</span> - It's a wonderful world
</div>
<div id="fpowered">
Powered by: <a href="http://getpelican.com/" title="Pelican Home Page" target="_blank" rel="nofollow noopener noreferrer">Pelican</a>
Theme: <a href="https://elegant.oncrashreboot.com/" title="Theme Elegant Home Page" target="_blank" rel="nofollow noopener noreferrer">Elegant</a>
</div>
</footer> <script src="//code.jquery.com/jquery.min.js"></script>
<script src="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script>
<script>
function validateForm(query)
{
return (query.length > 0);
}
</script>
<script>
(function () {
if (window.location.hash.match(/^#comment-\d+$/)) {
$('#comment_thread').collapse('show');
}
})();
window.onhashchange=function(){
if (window.location.hash.match(/^#comment-\d+$/))
window.location.reload(true);
}
$('#comment_thread').on('shown', function () {
var link = document.getElementById('comment-accordion-toggle');
var old_innerHTML = link.innerHTML;
$(link).fadeOut(200, function() {
$(this).text('Click here to hide comments').fadeIn(200);
});
$('#comment_thread').on('hidden', function () {
$(link).fadeOut(200, function() {
$(this).text(old_innerHTML).fadeIn(200);
});
})
})
</script>
</body>
<!-- Theme: Elegant built for Pelican
License : MIT -->
</html>