自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

性能優(yōu)化系列:每個程序員都應該知道的數字

新聞 前端
本文著重介紹了業(yè)務開發(fā)在做性能優(yōu)化需要掌握的一些核心概念,之所以放在最先介紹,是因為在我做性能優(yōu)化的過程中,發(fā)現絕大多數性能問題都是由于網絡I/O和磁盤I/O引起的。

 [[429492]]

前言

交流群里最常聽到的一句話就是:我項目太垃圾了,面試怎么辦。說實話,我聽了也感同身受,因為我也是這么走過來的。而且,幾乎大部分人都會經歷這個過程。所以,不多說了,安排。

之所以挑性能優(yōu)化這個方向,主要有幾個原因:

1)性能優(yōu)化是我很感興趣的一個方向,同時在過去幾年,我在這個方向上積累了一些經驗,可以說,我之前的面試,項目上幾乎是靠性能優(yōu)化一招走遍天下。因此,我覺得可以拿出來和大家分享一下。

2)性能優(yōu)化非常通用,幾乎對于所有線上項目都可以適用,大家掌握了之后,立馬可以到項目中實踐起來。我想,應該不存在不需要性能優(yōu)化的項目,除非你的項目只有“Hello world”。

3)性能優(yōu)化大部分內容非常簡單,幾乎沒有門檻,經驗較淺的同學也很容易上手,同時性能優(yōu)化也適用二八原則:掌握20%的內容,足以解決80%的問題。

4)性能優(yōu)化很容易拿到結果,稍微有經驗點的同學應該知道,做需求最怕拿不到結果,性能優(yōu)化就不一樣了,都是很直白的數字。1小時的任務,我優(yōu)化成5分鐘,性能提升就是十來倍,簡單粗暴。

不多說了,開懟。

正文

文章的標題來源于 Jeff Dean 在谷歌的內部一次分布式系統的演講,英文標題為:Numbers Everyone Should Know。

這些數字與我們后續(xù)做性能優(yōu)化息息相關,因此我將這部分內容放在第一篇,幫助大家建立基本的性能概念。

先來看 Jeff Dea n 所說的數字是哪些:

注:1μs = 1000ns、1ms = 1000 μ s

操作

耗時/延遲

耗時*10億

一級緩存讀?。↙1)

0.5ns

0.5s

分支錯誤預測

5ns

5s

二級緩存讀取(L2)

7ns

7s

互斥鎖的加鎖解鎖

25ns

25s

內存尋址

100ns

100s

Zippy壓縮1KB數據

3000ns( 3 μs ) 50min

在1Gbps網絡上發(fā)送1KB數據

10,000ns( 10 μ s )

2.8h

從SSD(1GB/s)隨機讀取4KB數據

150,000ns( 15 0μs ) 1.7days

從內存順序讀取1MB數據

250,000ns( 250μs )

2.9days
數據包在同數據中心一個往返 500,000ns ( 500μs ) 5.8days

從SSD (1GB/s) 順序讀取1MB數據

1,00 0,000ns ( 1ms ) 11.6days

磁盤尋道

10,00 0,000ns( 10 ms )

3.8months

從磁盤順序讀取1MB數據

20,00 0,000ns(20ms)

7.9months

數據包從美國到荷蘭一個往返

150,00 0,000ns(150ms)

4.75years

表格 第三列將耗時數據提升10億倍,換算成大家更容易看的單位。

這份數據的最初來源為  Peter Norvig 的文章 :Teach Yourself Programming in Ten Years,地址:http://norvig.com/21-days.html。

伯克利 的  Colin Scott 根據這份 數據,通過一定的算法,制作了一個可以根據時間的推移而變化的網站,地址為:https://colin-scott.github.io/personal_website/research/interactive_latency.html,源碼中注釋有詳細解釋計算邏輯,例如網絡帶寬是按每2年增加1倍,DRAM帶寬按每3年增加一倍。

根據 Colin Scott 的圖表來看,到2021年,網絡帶寬、內存、SSD、磁盤,都有數量級的提升,而 CPU 相關的一二級緩存變化不大,有興趣的可以自己點進去看一看。

看這些數據的目的

首先,這些數據肯定不是完全準確的,受限于眾多環(huán)境因素的影響,其實很難有所謂的準確數字。

我們看這些數據更多是了解每個操作的耗時量級,各個操作之間的數量級比率,從而對于我們工作中接觸到的一些相關知識有初步的概念。

而我將這個數據放在性能優(yōu)化系列文章的開篇,主要想先傳達給各位同學幾個概念:

1)CPU非常非???/h4>

CPU執(zhí) 行大部分簡單指令只需要1個時鐘周期,我用個人電腦測試時,CPU可以睿頻到 4.40GHz(見第2點的測試圖),也就是說此時執(zhí)行一個簡單指令需要的時間大約是1/4.4ns,也就是0.23ns(納秒)。

這是什么概念了,舉個簡單的例子,即使是真空中傳播的光,在0.23 ns 內也只能走不到7厘米。

2)內存很快了,但是相比CPU來說還是太慢了

CPU和內存之間的瓶頸通常稱為馮·諾伊曼瓶頸。具體差別有多大了,我用自己的電腦做了個簡單的測試。

我電腦 是 今年剛買的,硬件應該都還比較新,但是配置比較普通,僅供參考。

CPU配置是 11th Gen Intel Core i5-11400F@2.60GHz,睿頻4.40GHz,測試結果看也確實跑到了4.40GHz了, 內存配置是  DDR 4 3 2 00MHz。

測試結果如下圖所示:

從上圖看,內存的讀取速度為41GB/s,感覺還是挺快的,但是L1 Cache為3TB/s,一比較,相差還是很大。

如果CPU按4.40GHz來算,執(zhí)行一個簡單指令需要的時間大約是0.23ns(納秒),而內存的延遲是88.7ns,相當于CPU去內存里取一個字節(jié),需要等待386個周期,可以看出,內存相較于CPU來說,確實太慢了。

這也是為什么引入了L1、L2、L3緩存的原因,不過這邊我們不深入去研究這些東西,只是對CPU和內存的性能差距有個大概概念。

3)磁盤性能非常非常慢

這個大家估計大家都知道,具體有多慢了, 我這邊在用自 己的電腦做了個簡單的測試。

我電腦剛好有兩塊硬盤,一塊256GB的SSD(固態(tài)硬盤),一塊1T的HDD(機械硬盤)。

SSD測試結果如下圖所示:

忽略隊列(Q)和線程(T)的影響,順序讀(SEQ)的性能為1535.67MB/s,隨機讀(RND)的性能為49.61MB/s。

對比下上面內存的性能 41GB/s ,盡管是SSD,性能還是存在數量級的差距,另一個就是隨機讀的性能相比順序讀也是存在數量級的差距。

HDD測試結果如下圖所示:

忽 略隊列(Q)和線程(T)的影響,順序讀(SEQ)的性能為183.49MB/s,隨機讀(RND)的性能為0.6MB/s。

對比下上面SSD的性能:順序讀 1535.67 比183.49,存在一個數量級的差距,隨機讀 49.61 比0.6,存在兩個數量級的差距。

而HDD順序讀和隨機讀的性能差距相比SSD就比較嚴重了,大概有300倍。簡直慘不忍睹,不過相信現在的服務器應該基本都是SSD了。如果發(fā)現自己公司服務器的磁盤還是HDD,那就趕緊溜吧。

4)磁盤順序I/O比隨機讀I/O快很多

這個在上面的測試也看出來了,都是數量級上的差距,特別是在以前的HDD上。有不少技術就是利用了順序I/O性能好的特點來提升性能,典型的有:kafka順序寫消息、Leveldb和RocksDB底層使用的LSM-Tree等。

5)網絡傳輸也是比較耗時的,基本都是毫秒級別

在開始的表格中可以看到,在同數據中心一個往返,需要0.5ms。

如果 是跨城市就更久了 , 這個 相信也不難理解,畢竟 信 號 要順著網線爬,距離越遠,當然所需時間就越久了 。

下圖是上海到一些城市進行PING操作所需的時間,可以看到張家口已經需要30ms左右了,這也差不多就是北上的延遲。

這也是為什么我們在服務器的路由策略上通常會優(yōu)先使用同機房優(yōu)先、同中心優(yōu)先的策略。

這讓我想到我之前碰到的一個問題,當時是一個新服務在測試,數據庫基本沒數據,測試場景也是很簡單的增刪改查,但是接口的性能就是很差,動不動就上百毫秒。

仔 細看了調用鏈后,發(fā)現每次DB操作都需要30ms左右,看了下機房分布后 ,發(fā)現是應用服務器和 數據庫 服務器跨城市了,一個在北京一個在上海,導致會有固定30ms左右的延遲 。將兩者換到同機房后,基本就是1ms了。

總結

本文著重介紹了業(yè)務開發(fā)在做性能優(yōu)化需要掌握的一些核心概念,之所以放在最先介紹,是因為在我做性能優(yōu)化的過程中,發(fā)現絕大多數性能問題都是由于網絡I/O和磁盤I/O引起的。 對這些概念心中有數后 ,有利于我們更快的定位出性能瓶頸,從而更快的解決問題。

 

 

責任編輯:張燕妮 來源: 程序員囧輝
相關推薦

2012-02-28 10:52:13

2018-03-07 12:57:53

2012-10-11 10:32:48

Linux命令程序員

2023-01-31 15:43:47

2022-09-11 15:20:05

程序員命令開發(fā)

2024-04-10 12:36:41

硬件代碼

2023-12-27 09:00:00

Python魔術方法開發(fā)

2024-04-24 14:52:26

JavaScriptWeb 開發(fā)

2023-11-02 14:21:06

2011-07-25 10:09:57

Python

2021-08-19 15:14:29

程序員電子表格Airtable

2014-07-16 09:34:44

2020-09-03 12:54:37

Python程序員macOS

2023-06-27 00:04:10

程序員JavaScript

2015-04-16 10:26:51

程序員 Python Ruby

2021-10-20 06:05:01

編程語言開發(fā)

2013-03-20 17:58:41

虛擬內存程序員

2011-06-16 08:58:57

軟考程序員

2017-04-07 10:40:48

程序員學習命令行

2015-07-02 11:20:17

程序員代碼
點贊
收藏

51CTO技術棧公眾號