1. 程式人生 > 實用技巧 >spring boot的學習

spring boot的學習

跟光磊學Linux運維-淺談計算機系統

跟光磊學Linux運維

什麼是計算機

計算機(Computer)是一種用於高速計算的電子機器,可以進行數值運算、邏輯判斷,能夠接收和儲存資訊資料(文字、 圖片、音訊、視訊等等),並按照儲存在其內部的程式對海量資訊資料進行自動、高速的處理,然後把處理的結果輸出的現代化智慧電子裝置。
日常生活中常見的桌上型電腦(iMac Pro)、筆記本(MacBookPro)、手機(iPhone12)、平板(iPad Pro)等等都屬於計算機,除此以外還有生產環境中支撐各種應用(電商、支付、金融、物流等等)的大型伺服器叢集(Server Cluster)都屬於計算機。

Linux運維工程師在工作時更多的是與開發環境、測試環境、生成環境的伺服器叢集打交道

計算機系統組成

計算機系統由硬體(Hardware)系統和軟體(Software)系統兩大部分組成。
軟體是執行在硬體之上,而硬體效能的好壞會直接影響軟體執行的效能。
計算機通過軟硬體的共同協作就可以完成日常常見的任務,例如聽歌、看電影、購物、聊天等等。


計算機系統組成

計算機硬體系統

計算機硬體系統主要由主機和外部裝置組成。

主機主要是包含中央處理器和記憶體儲器

  • 中央處理器主要由運算器和控制器組成,實現資料的數值計算、邏輯判斷和其他裝置控制。
  • 記憶體儲器分為RAM和ROM,其中RAM(Random Access Memory)表示隨機儲存記憶體,程式執行時指令和資料都會被載入到記憶體中,這種儲存器在斷電時將會丟失其儲存的內容。而ROM(Read-Only Memory)表示只讀記憶體,是一種只能讀出事先儲存資料的固態半導體儲存器。

外部裝置主要包含外儲存器、輸入裝置、輸出裝置組成。
常見的外儲存器包含行動硬碟U盤等等。

  • 外部儲存器通常用於大容量儲存資料,IO效能比記憶體要低的多,但是隻要硬體裝置不壞的情況下能夠永久儲存資料,而常見的輸入裝置包含滑鼠鍵盤等等,常見的輸出裝置包含音效卡、顯示卡等等。
  • 網絡卡也是屬於輸入輸出裝置的一種,主要用於網路上的資料接收和傳送。

在後期程式排查錯誤時除了要考慮程式本身的錯誤以外,還要考慮計算機硬體故障,例如記憶體不足,磁碟寫滿,網路不通等問題

計算機軟體系統

軟體的出現實現了人和計算機更好的互動,它是由開發人員採用某種程式語言(C/C++/Java/Python/Go/JavaScript等等)編寫的一系列指令以及不同業務場景產生的資料組成。
通常將軟體分為系統軟體和應用軟體

  • 系統軟體
    驅動程式、作業系統、語言處理程式等都是屬於系統軟體。
    驅動程式是硬體廠商使用程式語言(C/C++)編寫的程式,在使用硬體(例如印表機、顯示卡、音效卡等等)前必須安裝對應的驅動程式。
    作業系統是負責通過驅動程式管理硬體資源,同時給應用軟體提供執行平臺,目前主流的作業系統有Windows,Linux,macOS,Android,iOS,華為鴻蒙OS。
    語言處理程式是用於將程式語言編寫的源程式編譯或者解釋成對應平臺的機器語言的程式。

  • 應用軟體
    微信、支付寶、淘寶、WPS等等都是屬於應用軟體,它們都是執行在作業系統(Windows,Linux,macOS)之上的。
    執行在不同作業系統之上的軟體互動方式也不一樣,Linux(CentOS)上的軟體通常是使用字元介面的互動方式,執行在Windows,macOS上的軟體通常是以滑鼠、鍵盤操作的互動方式,執行在Android,iOS上的軟體通常是以手勢觸控、語音等互動方式。

計算機發展史

在1946年,世界上第一臺計算機ENIAC(electronic numerical integrator and calculator)在美國賓州大學誕生,是美國奧伯丁武器試驗場為了滿足計算彈道導彈需要而研製成的。使用了17468只電子管,佔地170平方米。重達30噸,耗電170千瓦 ,耗資40多萬美元,每秒可以進行5000次加法或者減法運算。


世界上第一臺計算機

隨著電子技術的迅猛發展,計算機的發展歷史經過了四個時代的發展。

  • 第一代:電子管計算機時代。時間:1946-1958年。這一代計算機的主要邏輯器件是電子管,使用的是機器語言程式設計,之後又產生了組合語言。運算速度為每秒幾千次到幾萬次。主要應用範圍為科學計算、軍事和科學研究。
  • 第二代:電晶體計算機時代。時間:1959年-1964年。這一代計算機的主要邏輯器件是電晶體,已經出現了管理程式和FORTRAN等高階程式語言。運算速度為每秒幾十萬次。主要應用範圍為資料處理、自動控制等。
  • 第三代:中小規模積體電路計算機時代。時間:1965年-1970年。這一代計算機的主要邏輯器件是中、小規模積體電路,此時已經出現了作業系統、診斷程式和BASIC、PASCAL等高階語言。運算速度為每秒幾十萬次到幾百萬次。主要應用範圍為科學計算、資料處理、事務管理、工業控制等領域。
  • 第四代:大規模積體電路計算機時代。時間:1971年以後。這一代計算機的主要邏輯器件是大規模和超大規模積體電路以及微處理器晶片,由於運算速度快、儲存容量大、計算機技術與網路技術和通訊技術相融合,使計算機軟體有了突飛猛進的發展,各種作業系統、資料庫技術和各種應用軟體應運而生。

隨著計算機的發展,現在已經出現生物計算機和量子計算機。
生物計算機是以蛋白質分支作為主要原材料,和人體結合起來進行相關的運算。而且生物計算機體積小,不易損壞,提供生物級別的自動修復以及不受訊號干擾和無熱損耗。
量子計算機是遵循量子力學的物理計算機,目前量子計算機已經有相關的研究成果。

  • 2013年5月,谷歌和NASA釋出了D-Wave Tow
  • 2017年5月,中國科學院宣佈製造出光量子計算機。
  • 2019年1月,IBM展示了世界首款商業化量子計算機

而且目前國內的阿里和騰訊在量子計算機領域進行相關的研究。

馮諾依曼體系結構

從第一臺計算機誕生到現在,計算機的體系結構一直都是遵循馮諾依曼體系結構。1946年美籍匈牙利數學家馮諾依曼提出儲存程式原理,把程式本身當作資料來對待,程式和該程式處理的資料用同樣的方式來儲存。馮諾依曼體結構馮諾依曼理論的要點是

  1. 數字計算機的數制採用二進位制(0或者1),一位二進位制表示1bit。
  2. 計算機應該按照程式處理的順序執行,程式是由開發人員使用開發語言(c/c++/java/scala/python/go/javascript/rust)編寫的一系列指令序列。
  3. 計算機硬體由運算器、控制器、儲存器、輸入裝置和輸出裝置五大部分組成。


馮諾依曼體系結構

  • 輸入裝置主要是接受外界輸入的資料輸入到計算機的儲存器(這裡指的是主儲存器也就是記憶體)中,最常見的輸入裝置就是滑鼠、鍵盤、掃描器、攝像頭等等。
  • 運算器從主儲存器中獲取輸入的資料進行相關的運算,並將結果按照程式的意圖輸出到輸出裝置(音效卡、顯示卡)或者儲存到輔儲存器(磁碟)中。
  • 控制器用於協調(類似於生活中的交警指揮交通)計算機的其他元件協同工作。

目前運算器和控制器已經整合在CPU中,主要用於資料的計算和控制其他裝置的協同工作

計算機進位制及其轉換

計算機進位制介紹

進位制的定義:進位制是一種計數方式,也稱為進位計數法或者位值計數法,使用有限數字符號表示無限的數值,使用的數字符號的數目稱為這種進位制的基數或者底數,例如十進位制就是由0-9十個數字組成。在計算機記憶體中,都是以二進位制的補碼形式來儲存資料的,生活中以十進位制方式計算的資料居多,例如賬戶餘額,開發人員的薪水等等。而 計算的記憶體地址、MAC地址等等通常都是使用十六進位制表示的,Linux的許可權系統採用八進位制的資料表示的。相同進位制型別資料進行運算時會遵守加法:逢R進1;減法:**借1當R,**其中R就表示進位制。

計算機常用進位制的組成、示例和使用場景

進位制名稱 組成 數值示例 應用場景
二進位制 0,1 1010 計算機內部資料表示
八進位制 0,1,2,3,4,5,6,7 010 Linux許可權系統
十進位制 01,2,3,4,5,6,7,8,9 12 整數
十六進位制 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f 12f 資料的記憶體地址

計算機底層為什麼只能識別二進位制

我們目前主要使用的計算機都是大規模積體電路,是採用大規模和超大規模的積體電路作為邏輯元件的。積體電路按其功能、結構的不同,可以分為模擬積體電路、數字積體電路和數/模混合積體電路三大類。而我們的計算機主要是採用數字積體電路搭建的。邏輯閘是數字邏輯電路的基本單元。常見的邏輯閘包括“與”門,“或”門,“非”門,“異或”等等。通過邏輯閘可以組合使用實現更為複雜的邏輯運算和數值運算。邏輯閘可以通過控制高、低電平,從而實現邏輯運算。電源電壓大小的波動對其沒有影響,溫度和工藝偏差對其工作的可靠性影響也比類比電路小得多,所以相對穩定。因為數字計算機是由邏輯閘組成,而邏輯電路最基礎的狀態就是兩個:開和關。所以,數位電路是以二進位制邏輯代數為數學基礎。二進位制的基本運算規則簡單,運算操作方便,這樣一來有利於簡化計算機內部結構,提高運算速度。但是在日常開發中,通常都會使用八進位制和十六進位制,因為八進位制和十六進位制相對於二進位制表示資料更加簡潔,而且一個八進位制表示三個二進位制,一個十六進位制表示四個二進位制。例如1024使用二進位制表示為0b100 0000 0000,使用八進位制表示為02000,使用十六進位制表示為0x400。

十進位制轉二進位制、八進位制、十六進位制

十進位制轉換二進位制、八進位制、十六進位制可以採用短除法,即待轉換的十進位制數除以指定的進位制(例如2,8,16),直到商數為0,求餘數。

十進位制101轉換為二進位制的計算過程

重複除以2 商數 餘數
101/2 50 1
50/2 25 0
25/2 12 1
12/2 6 0
6/2 3 0
3/2 1 1
1/2 0 1

然後將餘數的結果從下到上串聯起來的結果:1100101,即十進位制的101轉換為二進位制的結果為1100101

十進位制的237轉換為二進位制

重複除以2 商數 餘數
237/2 118 1
118/2 59 0
59/2 29 1
29/2 14 1
14/2 7 0
7/2 3 1
3/2 1 1
1/2 0 1

然後將餘數的結果從下到上串聯起來的結果:11101101,即十進位制的237轉換為二進位制的結果為11101101。

除了短除法以外,如果掌握了常見的十進位制數對應的二進位制數

科學計數法 十進位制 二進位制
2^0 1 1
2^1 2 10
2^2 4 100
2^3 8 1000
2^4 16 10000
2^5 32 100000
2^6 64 1000000
2^7 128 10000000
2^8 256 100000000
2^9 512 1000000000
2^10 1024 10000000000

在進行十進位制轉二進位制時,還可以使用減法來轉換
以十進位制11轉換為二進位制為例,因為11介於16和8中間,而11-8=3,8的二進位制表示為1000,3的二進位制是11,而二進位制的1000+11=1011,因此十進位制的11轉換為二進位制的結果是1011

Windows系統中可以使用計算器(calc)來實現進位制之間的轉換

linux也可以使用bc命令來實現進位制的轉換

[root@centos8 ~]# bc #啟動linux系統的計算器
bc 1.07.1
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
obase=2 # 輸出結果使用二進位制顯示
11 #輸入十進位制的11
1011 #輸出十進位制11的二進位制結果

obase=2表示輸出為二進位制,預設輸入為十進位制

二進位制、八進位制、十六進位制轉十進位制

首先明確不同進位制的值是如何計算的,這裡以十進位制和二進位制為例子,闡述它們的計算過程。

十進位制整數1024

1024=1*10^3+2*10^1+4*10^0=1000+20+4=1024

二進位制整數 10000000000

10000000000 =1*2^10=1024

二進位制、八進位制、十六進位制整數轉十進位制整數是使用按權展開法計算的,這裡以二進位制資料01100101為例子。從右往左開始數,如果二進位制位為1,則依次用1*2^n,n從0開始。

二進位制整數01100101 轉換為十進位制整數的計算過程

01100101=2^6+2^5+2^2+2^0=64+32+4+1=101

八進位制整數0127轉換為十進位制整數的計算過程

0127=1*8^2+2*8^1+7=64+16+7=87

十六進位制整數0x12f轉換為十進位制整數的計算過程

0x12f=1*16^2+2*16^1+f*16^0=256+32+15=303

二進位制的1011轉換為十進位制的計算過程

1011=1000+11=2^3+2^1+2^0=8+2+1=11


使用linux的計算器bc命令實現二進位制轉十進位制

二進位制轉八進位制、十六進位制

二進位制轉八進位制是按照從右往左,每3位二進位制對應1位八進位制,因為2的3次方等於8

二進位制整數11001100轉八進位制計算過程

11 001 100 =0314

二進位制轉十六進位制是按照從右往左,每4位二進位制對應1位十六進位制,因為2的4次方等於16。

二進位制整數1100 1110轉十六進位制計算過程

1100 1110 =0xce

八進位制、十六進位制轉二進位制

八進位制轉二進位制是按照從右往左,每1位八進位制對應3位二進位制。

八進位制整數0127轉二進位制整數計算過程

0127=001 010 111

十六進位制轉二進位制是按照從右往左,每1位十六進位制對應4位二進位制。

十六進位制整數0x12f轉換為二進位制整數計算過程

0x12f=0001 0010 1111

計算機的計算單位

容量單位

在購買電腦時,通常會選擇高配置的記憶體、硬碟。

例如2020款16寸的MacBookPro已經可以選配64G記憶體和8T的固態硬碟,而這裡的64G和8T就是計算機常用的容量單位。

在物理層面,我們使用高低電平來記錄資訊,通常使用高電平表示1,低電平表示0,因此在計算機底層只能認識0,1兩種狀態。而0,1能夠表示的內容太少,迫切需要更大的容量表示方法,因此誕生了位元組(Byte),千位元組(KB),兆位元組(MB),吉位元組(GB),太位元組(TB),拍位元組(PB),艾位元組(EB),除了bit和Byte之外,從Byte到KB,MB,GB,TB,PB,EB,它們的換算都是以2的10次方即1024換算的。

1YB=1024ZB
1ZB=1024EB
1EB=1024PB
1PB=1024TB
1TB=1024GB
1GB=1024MB
1MB=1024KB
1KB=1024B
1Byte=8bit
  • 位(bit)是最小的計算機容量單位,通常用於閘電路,只能儲存0或者1
  • 位元組(Byte)、千位元組(KB)、兆位元組(MB)表示網路傳輸,檔案大小。位元組是最基本的容量計量單位,一個位元組能儲存255個數據。
  • 吉位元組(GB)通常用於表示計算機記憶體、磁碟的容量單位
  • 太位元組(TB),拍位元組(PB)通常是用於表示雲盤、行動硬碟的容量單位
  • 艾位元組(EB)通常是用於表示資料中心的容量單位

現在通常筆記本的記憶體通常是16G,32G,64G等等,而執行在筆記本之上的作業系統普遍都是64位的,因為32位系統只能使用4G記憶體,下面是4G的記憶體換算

4G=2^2 - 2^10 - 2^10 - 2^10 =4*1024*1024*1024=2^32

在購買記憶體或者買行動硬碟時,通常使用的儲存單位就是GB或者是TB,
但是在買4T的行動硬碟時,實際的可用容量卻只有3T多,因為計算機的儲存單位是以2的10次方(即1024)換算,而硬碟廠商們是以10^3(即1000)為換算單位。

4T的硬碟換算成位如下所示

4T=4*1024GB*1024MB*1024KB*1024B*8bit

而硬碟廠商的實際容量

4T=1000*1000*1000*1000*8bit

因此實際的可用容量是

4*1000*1000*1000*1000/1024/1024/1024/10243.63T

而在一些網際網路巨頭(例如國內的BAT,國外的亞馬遜、蘋果、微軟、谷歌,臉書)公司中,可能使用到比TB更大的海量資料,也就是PB或者EB,它們的換算單位如下所示。

1PB=1024TB
1EB=1024PB

速度單位

網路速度

網路常用的單位是Mbps
而網路頻寬提供商(例如長城寬頻)聲稱的百兆頻寬實際上是100Mbit/s,但是100M光纖測試的峰值速度只會有12.5MB/s,它們之間的換算是100Mbit/s=(100/8)MB/s=12.5MB/s。

CPU速度

CPU的速度一般是由CPU的時鐘頻率所體現的,而時鐘頻率的單位是赫茲(Hz),目前主流的CPU時鐘頻率一般都在2GHz以上,而赫茲(Hz)其實就是秒分之一,也就是每秒鐘的週期性變動重複次數的計量。
GHz即十億赫茲(10^9Hz),2GHz就是二十億赫茲,也就是說2GHz的CPU每秒可以變化20億次。

1Khz=1000Hz
1Mhz=1000KHz
1Ghz=1000MHz

伺服器分類

按規模劃分

按規模劃分:伺服器按照規模可以分成超級計算機、大型計算機、小型機以及微型計算機

  • 超級計算機:應用於國防尖端技術和現代科學計算中,超級計算機的運算速度可以達到每秒百萬億以上。如果想要了解超級計算機的排名以及效能指標,可以訪問top500.org站點
  • 大型計算機:具有較高的運算速度,每秒可以執行幾千萬條指令,而且有較大的儲存空間,往往用於科學計算,資料處理或者作為網路伺服器使用,因為價格昂貴(千萬RMB/臺),通常都是隻有大型銀行使用,例如IBM Z15
  • 小型機:指採用精簡指令集處理器,效能和價格介於PC伺服器和大型主機之間的一種高效能64位計算機,在中國,小型機習慣用來指UNIX伺服器,因為價格昂貴(百萬RMB/臺),通常只有電信,銀行使用。
  • 微型計算機: 指的是採用X86 CPU架構的PC伺服器,中央處理器(CPU)採用微處理器晶片,體積小巧輕便,廣泛用於商業,服務業,工廠的自動控制、辦公自動化以及大眾化的資訊處理。價格便宜,網際網路公司首選。

阿里巴巴在2009年發起去IOE運動,使用微型計算機(也就是廉價的PC伺服器)代替IBM的小型機,使用開源的資料庫MySQL代替商業資料庫Oracle,使用開源的儲存代替價格昂貴的EMC儲存。目前絕大多數公司(傳統銀行、網際網路公司)都轉向微型計算機,因為其成本低,執行穩定,效能滿足絕大部分業務場景。

按功能和角色劃分

按功能和角色劃分:計算機按功能和角色劃分可以分為伺服器和客戶機

  • 伺服器(Server)是計算機的一種,是網路中為客戶端(Client)計算機提供各種7*24小時服務的高效能計算機,伺服器在網路作業系統的控制下,將與其連線的CPU、硬碟、記憶體以及昂貴的專用通訊裝置提供給網路上的客戶站點共享,也能為網路使用者提供集中計算、資訊釋出以及資料管理服務。
  • 客戶機(Client):用於向伺服器發出請求,需要伺服器為之提供相應的服務和支援的計算機。

一般情況下伺服器的硬體效能要普遍高於客戶機

伺服器按照應用功能分為Web伺服器(Nginx,Apache)、負載均衡伺服器(LVS,HAProxy)、應用伺服器(SpringCloud,Dubbo,Service Mesh)、資料庫伺服器(MySQL)、快取伺服器(Redis)、分散式檔案儲存伺服器(Ceph)、中介軟體應用伺服器(RabbitMQ、RocketMQ、Kafka)、日誌伺服器(ELK)、監控伺服器(Zabbix、Prometheus、Grafana,Skywalking)、程式版本控制伺服器(GitLab)、虛擬機器伺服器(KVM)、郵件伺服器、域控制伺服器(DNS)等等。

伺服器按照外形分類

PC伺服器按照外形分類:塔式伺服器、刀片式伺服器、機架式伺服器。
目前機架式伺服器是目前銷售數量最多的伺服器(例如華為(HUAWEI)2488H V5 2U機架式伺服器),機架式伺服器按照統一標準設計,配合機櫃統一使用。機架式伺服器便於統計管理、高密度,節省空間機箱尺寸比較小巧,在機櫃中可以同時放置多臺伺服器。

機架式伺服器的寬度為19英寸(48.26cm),高度以U為單位,例如4U,1U=1.75英寸=44.45mm,通常有1U,2U,3U,4U,5U,7U幾種標準的伺服器,2U,4U是主流機架式伺服器,機櫃的尺寸也採用通用的工業標準。

目前中小型網際網路企業中通常都不會單獨購買伺服器,而是直接採購阿里雲或者是騰訊雲服務,然後通過網路遠端連線伺服器。而大型網際網路公司(例如京東、美團)會構建自己的雲服務。

伺服器硬體組成

伺服器硬體的組成和普通家用電腦的結構組成是類似的,但是與家用電腦不同的是伺服器的硬碟是支援熱插拔的,而且伺服器的CPU通常是Intel至強系列。由於伺服器需要對外7×24小時 提供服務,伺服器的元件通常是高效能、高可用的。

  • 伺服器的CPU通常是Intel E系列(至強系列),而不是家用的Intel i7,Intel i9。
  • 伺服器的硬碟介面是SAS,而不是家用電腦磁碟的SATA介面,同時支援RIAD卡用於資料的容錯和效能提升。
  • 伺服器支援多個(一般是四塊網絡卡)千兆網絡卡和萬兆網絡卡。
  • 伺服器的記憶體條支援擴充套件至64G-512G記憶體。
  • 伺服器一般都支援雙路電源。

伺服器硬體-主機板

主機板(mainboard)安裝在機箱內,是計算機最基本,也是最重要的部件之一。
主機板一般為矩形電路板,上面安裝了組成計算機的主要電路系統,一般有BIOS晶片,I/O控制晶片,鍵盤和麵板控制開關介面,指示燈插接件,擴充插槽,主機板以及插卡的直流電源供電外掛等元件。
CPU、記憶體、硬碟,顯示卡就是裝在主機板上,其作用類似於人體的骨架。

伺服器硬體-CPU

CPU是Central Processing Unit的縮寫,即中央處理器。由馮諾依曼體系結構的運算器和控制器構成,是整個計算機硬體系統中重要的組成部分。
目前主流的伺服器CPU製造廠商主要是Intel、AMD、IBM,其中Intel的伺服器CPU是Xeon至強系列,AMD的主要是Althlon MP,IBM的主要是Power系列。

絕大部分機架式伺服器採用的都是X86架構複雜指令集 Intel Xeon至強系列的CPU,IBM的小型機都是Power PC系列。
手機的CPU都是基於ARM(Acorn RISC Machine)架構的,例如蘋果的A系列,高通的驍龍系列以及華為的麒麟系列。

CPU的效能指標主要有主頻、外頻和倍頻。

  • 主頻是CPU的時鐘頻率(CPU Clock Speed),是CPU運算時的工作頻率(即1秒鐘內發生的同步脈衝數)的簡稱。單位是Hz,一般來說,主頻越高,CPU的速度越快,由於內部結構不同,並非所有的時鐘頻率相同的CPU的效能都一樣。
  • 外頻:系統匯流排的工作頻率,CPU與外部(主機板晶片組)交換資料、指令的工作頻率
  • 倍頻:倍頻則是指CPU外頻與主頻相差的倍數
    主頻、外頻與倍頻三者之間的關係是主頻=外頻×倍頻

CPU內部內建了快取記憶體,快取記憶體是用於高速交換資料和指令的儲存器,CPU的快取分為一級快取、二級快取、三級快取,即L1,L2,L3。三級快取遵循容量越小,速度越快,價格越貴的原則。
Windows下可以在資源管理器的效能選項檢視CPU三級快取的容量

Linux下可以使用lscpu命令檢視CPU三級快取的容量

[guanglei@centos8 ~]$ lscpu #檢視cpu資訊
Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              8
On-line CPU(s) list: 0-7
Thread(s) per core:  1
Core(s) per socket:  4
Socket(s):           2
NUMA node(s):        1
Vendor ID:           GenuineIntel
CPU family:          6
Model:               158
Model name:          Intel(R) Core(TM) i9-8950HK CPU @ 2.90GHz
Stepping:            10
CPU MHz:             2903.998
BogoMIPS:            5807.99
Hypervisor vendor:   VMware
Virtualization type: full
L1d cache:           32K
L1i cache:           32K
L2 cache:            256K
L3 cache:            12288K

L1d cache: 32K 表示CPU一級資料快取
L1i cache: 32K 表示CPU一級指令快取

由於CPU處理速度相對於記憶體效率更快,因此通常利用CPU的快取提高效率。

  • 記憶體匯流排速度:一般等同於CPU的外頻,指的是CPU與二級快取記憶體和記憶體之間的通訊速度。
  • 地址匯流排寬度決定了CPU可以訪問的實體地址空間。

伺服器硬體-記憶體

CPU無法直訪問硬碟中的資料,硬碟中的資料需要載入到記憶體中才能被CPU訪問。

記憶體是介於CPU和外部儲存之間,是CPU對外部儲存中程式與資料進行高速運算時存放程式指令、資料和中間結果的臨時場所,它的物理實質就是一組具備資料輸入輸出和資料儲存功能的高速積體電路。記憶體是CPU能直接定址的儲存空間,由半導體器件製成,記憶體的特點是存取速度快,計算機中所有的程式執行都是在記憶體中進行的,因此記憶體的效能對計算機的影響非常大,與記憶體對應的外存通常指的是硬碟,U盤。
記憶體和外存的區別是記憶體斷電後資料會丟失,而外存(磁碟、U盤)斷電後資料可以儲存。而且記憶體的讀寫效能高於硬碟,硬碟用於儲存大容量資料

記憶體的容量通常是GB,例如膝上型電腦的記憶體通常是16G-64G,伺服器的記憶體通常是32GB-512GB。

1Byte=8bit
1KB=2^10Byte=1024Byte
1MB=2^10KB=1024KB=2^10Byte
1GB=2^10MB=1024MB=2^20Byte
1TB=2^10GB=1024GB=2^30Byte
1EB=2^10TB=1024TB=2^40Byte

記憶體頻寬(速度)指的是記憶體與主機板的北橋晶片之間資料的傳輸率,單通道記憶體節制器一般是64bit,8個二進位制位(bit)相當於一個位元組(Byte),換算成位元組就是64bit/8=8Byte,再乘以記憶體的執行頻率,如果是DDR雙通道 記憶體就要再乘以2。
記憶體頻寬的計算公式:記憶體頻寬=記憶體匯流排頻率×資料匯流排位數÷8

例如單通道DDR4-4000記憶體頻寬計算

DDR4-4000:4000MHz×64bit/8=32000MB/S

雙通道DDR4-4000記憶體頻寬計算

DDR4-4000:4000MHz×64bit*2/8=64000MB/S

伺服器記憶體一般都具備線上備用記憶體技術記憶體映象技術來保證伺服器記憶體高可用

  • 線上備用記憶體技術
    當主記憶體或者是擴充套件記憶體中的記憶體出現多位錯誤是或者出現實體記憶體故障時,伺服器仍然繼續執行,由備用記憶體階梯故障記憶體的工作,備用的記憶體區域必須比其他區域的記憶體容量大或者相同。

  • 記憶體映象
    映象為系統在出現多位錯或記憶體物理故障時提供資料保護功能,以保證系統仍然能夠正常的執行,資料同時寫入兩個映象的記憶體區域,從一個區域進行資料的讀取。

伺服器硬體-硬碟

和CPU、記憶體不同的是硬碟不是必備的伺服器硬體,有些高併發的應用場景都是使用純記憶體 來提供服務,例如春晚搶紅包。

硬碟的介面分類
硬碟的主流介面型別為SATA介面、SAS介面、M.2介面,其中家用電腦的硬碟介面型別通常是SATA,伺服器的硬碟介面型別通常是SAS,SAS相容SATA介面。
而M.2是固態硬碟的介面型別,效能更強。

硬碟的結構分類
硬碟按照結構分類主要分為機械硬碟和固態硬碟兩種。

  • 機械硬碟
    機械硬碟的基本引數

  • 容量: 容量是硬碟的主要引數,單位有GB,TB,常見的容量有500GB,1TB,2TB,4TB,6TB

  • 轉速:轉速是指硬碟碟片每分鐘轉動的圈數,單位為rpm,常見的機械硬碟轉速有7200rpm,10000rpm和15000rpm,其中伺服器硬碟轉速一般為15000rpm

  • 傳輸速率:傳輸速率指的是硬碟的讀寫資料的速度,單位為MB/s即兆位元組每秒,常見的傳輸速率有6GB/s,12GB/s

  • 快取:硬碟快取的目的是為了解決系統前後級讀寫速度不匹配的問題,以提高硬碟的讀寫速度

  • 硬碟尺寸:3.5英寸/2.5英寸/1.8英寸

  • 是否支援熱插拔

機械硬碟主要由碟片、磁頭和馬達組成。

  • 機械硬碟的儲存介質是碟片,碟片的基板是金屬或者玻璃材質製成,為達到高密度高位定性的質量,基板要求表面光滑平整,不可能有任何瑕疵。

  • 磁頭是硬碟讀取資料的關鍵部件,它的主要作用是將儲存在硬碟碟片上的磁資訊轉換為電訊號向外傳輸。

  • 馬達上裝有一至多片碟片,以7200RPM,10000RPM,15000RPM等定速旋轉,為保持其平衡不可抖動,所以其質量要求嚴謹,不產生高溫噪音。

  • 固態硬碟

    固態硬碟SSD(Solid State Disk)泛指使用NAND Flash組成的固態硬碟。其特別之處在於沒有機械結構,以區塊寫入和抹除的方式作為讀寫的功能,因此在讀寫的效率上,非常依賴讀寫技術上的設計,SSD讀寫存取速度快,效能穩定,防震性高,發熱低,耐低溫,耗電低,無噪音,因為沒有機械部分,所以長時間使用出現故障機率比較小。缺點就是價格高,容量小,在普通硬碟前沒有價效比優勢,而且誤刪資料不能恢復。

機械硬碟資料誤刪容易恢復,效率低於固態硬碟,固態硬碟資料誤刪後不能恢復

伺服器硬體-網絡卡

伺服器在主機板上集成了網絡卡,傳輸速率為1Gbps,即千兆網絡卡,特殊應用需要高階網絡卡,例如光纖網絡卡,Infiniband網絡卡等,傳輸速率達到10Gbps,20Gbps,即萬兆網絡卡,通常伺服器上都是內建了4塊網絡卡。

伺服器元件IO效能彙總

每個計算機元件的IO效能也各不相同,核心元件(CPU,記憶體,磁碟)都遵循容量越大,IO效能越差,在後期程式優化時,通常需要考慮時間和空間的問題。

伺服器硬體效能瓶頸:
假設CPU有每秒處理100000個服務請求的能力,各種匯流排的負載能力達到50000個,但是網絡卡只能接受20000個請求,而硬碟只能負擔15000個的話,那麼這臺伺服器根據木桶效應的處理能力只能是每秒15000個請求,有85%的處理器能力浪費了。在計算機系統中,硬碟的讀寫速率已經成為影響系統進一步提高的瓶頸。

在後期優化程式時需要考慮程式時間複雜度和空間複雜度的問題,效能優化時,可以使用多執行緒併發來提高CPU的使用效率,而使用記憶體來快取高頻訪問的資料來提升程式的效能。

伺服器硬體-陣列卡

陣列(Raid)卡是用來實現RAID的建立和重建,檢測和修復多位錯誤,錯誤磁碟自動檢檢測功能,RAID晶片使CPU的資源得以釋放。
陣列卡的作用:陣列卡把若干硬碟驅動器按照一定要求組成一個整體,由陣列控制器管理的系統,陣列卡用來提高磁碟子系統的效能和可靠性,陣列卡的主要引數有支援RAID的級別(RAID0,RAID1,RAID5,RAID6等等),陣列卡提供快取以及電池保護。

伺服器硬體-電源

伺服器通常都是雙路電源,用於支援伺服器的電力負載,支援冗餘,防止電源故障。電源子系統包含智慧電源和風扇。伺服器上都是UPS電源,即使機房斷電,短時間內使用電源的電池供電。

伺服器硬體-顯示卡

伺服器都在主機板上集成了顯示卡,但是視訊記憶體容量不高,一般為16M或者32M,因為伺服器都是採用遠端連線工具(XShell,MobaXtrem)遠端登入伺服器,幾乎不使用顯示器。除非有特殊用途,例如需要做圖形計算時使用高配置的顯示卡。

伺服器硬體-熱插拔技術

熱插拔技術成為熱交換(Hot Swap)技術,允許在不關機的狀態下更換故障熱插拔裝置,常見的熱插拔裝置有硬碟,電源,PCI裝置以及風扇等。
熱插拔硬碟技術與RAID技術配合起來,可以使得伺服器在不關機的狀態下恢復故障硬碟上的資料,同時不影響網路使用者對資料的使用。

熱插拔需要注意:硬碟不在使用時進行熱插拔,如果是正在往硬碟寫資料,熱插拔則會丟失資料。

伺服器硬體-機櫃

機架式伺服器-伺服器放置在機櫃中,通常使用的機櫃是42U(約2米高),機櫃(1U=44.45mm),外觀尺寸一般為寬600mm×深1000mm×高2000mm,在一個機架上,累計裝置U數一般不超過26U,全1U裝置部署數量一般不超過16臺,全2U裝置一般不超過12臺,全4U裝置一般4臺到7臺,因為機櫃還要考慮伺服器散熱的問題,需要預留一定的空間。

Linux伺服器選型

一般情況下中小型網際網路公司在開發專案時,通常開發環境、測試環境會購買物理機,而生產環境通常會購買阿里雲或者騰訊雲的雲服務。或者所有的環境都採用阿里雲或騰訊雲的雲服務。而如果選擇阿里云云服務,可以直接去阿里雲官網根據不同的業務場景選擇對應的雲伺服器,具體選型可以諮詢阿里雲客服。

跟光磊學習Linux運維系列大概會搭建分散式系統中20個左右常用的服務叢集,推薦個人學習環境電腦的硬體配置不低於 Intel i9 CPU+32G記憶體+512G 固態硬碟,要是個人電腦的配置不高,也可以根據個人的需求直接購買阿里雲的伺服器。

Windows的電腦可以使用魯大師來檢測硬體,如果沒有特殊說明,後續所有操作都是基於Alienware 17R5膝上型電腦下完成

如果是運維人員為公司採購伺服器,按照不同的業務規模和應用場景可以選擇華為的 Fusion Server 2288H V5 和 華為(HUAWEI)2488H V5

如果是計算密集型,需要提高CPU的配置
如果是IO密集型,需要提高磁碟的配置
如果是高併發,需要提高記憶體的配置

華為(HUAWEI)2488H V5參考配置

作業系統

作業系統概述

在作業系統出現之前軟體都是直接執行在硬體之上的,因為硬體就是為了實現某個特定功能(例如彈道導彈計算),但是隨著計算機效能的不斷提高,可以同時在一臺計算機上同時執行多個軟體,這些軟體都需要訪問計算機硬體資源(CPU、記憶體、磁碟、網絡卡),此時需要一個協調者,因此作業系統就誕生了。

作業系統(Operating System)是一個通用目的的軟體程式,提供了硬體驅動(CPU、記憶體、音效卡、顯示卡、網絡卡、印表機)、程序管理、記憶體管理、網路管理、安全管理、檔案管理等通用功能提供給系統軟體和應用軟體使用。
作業系統介於應用軟體和計算機硬體之間,給應用軟體提供開發和執行平臺,同時管理和排程硬體資源。

平常使用的應用軟體(微信、支付寶、WPS)都是執行在作業系統之上,利用作業系統提供的通用功能實現聽音樂、上網、聊天等等應用。因為有了作業系統,應用軟體開發人員只需要專注功能實現,不需要關注硬體差異性。

目前主流的作業系統包含 伺服器端的RHEL、CentOS(RHEL社群版)、Ubuntu Server 和桌面端 Windows、 macOS、Ubuntu桌面版以及移動端Android 、IOS
華為鴻蒙OS是物聯網時代的作業系統,可以用於電腦、手機、平板,智慧屏,可穿戴裝置、嵌入式裝置

Linux運維主要是圍繞RHEL/CentOS與Ubuntu Server兩個系統以及相關的生態展開。

作業系統發展歷史

作業系統從最早期的單使用者作業系統發展成現在的個人計算機,甚至是分散式計算的演變過程。

  • 單使用者作業系統:一次只能支援一個使用者程式的執行,向用戶提供聯機互動式的工作環境,例如DOS。
  • 批處理系統:使用者將一批作業交給作業系統後就不再互動,由作業系統自動執行,提高系統執行效率。
  • 多道程式系統:一臺電腦上執行多個程式,程式控制CPU處理順序。
  • 分時系統:提高系統利用率,作業系統控制CPU的處理順序,多個人共用一臺計算機
  • 個人計算機:每個使用者對應一個系統,廉價,方便,易用
  • 分散式計算:每個使用者對應多個系統,雲端計算,大資料處理

作業系統互動式介面

作業系統通過介面的方式,建立了使用者與計算機硬體的溝通方式。使用者通過呼叫作業系統的介面來使用計算機的各種服務。

介面(interface):來源於電氣工程學科,指的是插座與插頭的連線口,起到將電與電氣連線起來的功能。後來延伸到軟體工程裡,指軟體包向外提供的功能模組的函式介面,所以介面是用來連線兩個東西,訊號轉換和遮蔽細節。

作業系統一般會提供兩個重要的介面來滿足使用者的一些一般性的使用需求:

  • 命令列介面
    實際上是一個叫shell的終端程式提供的功能,該程式底層的實質還是呼叫一些作業系統提供的函式。
    例如Windows上可以使用win+r快捷鍵開啟執行視窗

    然後輸入cmd後回車

    系統會彈出一個shell終端

    我們可以在上面輸入相關的命令並回車後執行,檢視相關結果的輸出
    例如使用ipconfig檢視無線網絡卡的ip地址

  • 圖形介面介面
    視窗介面通過編寫的視窗程式來接收來自作業系統訊息佇列的一些滑鼠、鍵盤動作,進而做出一些響應。Windows,macOS,Ubuntu都是使用視窗介面完成絕大多數日常任務,適用於廣大普通使用者。因此在桌面端的Windows作業系統佔據廣大市場份額。

在Linux運維的絕大多數任務都是基於命令列的字元介面完成。

開發介面標準

  • ABI
    ABI(Application Binary Interface) 即應用程式二進位制介面,描述了應用程式與作業系統之間的底層介面,允許編譯好的目的碼在使用相容ABI的系統中無需改動就能執行。
    Windows中程式的執行格式通常是PE(protable executable)格式,還有一些依賴的動態連結庫(檔名字尾通常是.dll 即dynamic link library)以及庫檔案(字尾名是.lib)
[root@centos8 ~]# file notepad.exe  # 使用file命令檢視記事本程式的執行格式
notepad.exe: PE32 executable (GUI) Intel 80386, for MS Windows

Linux中程式的執行格式通常是ELF(Executable and Linking Format),還有一些依賴的庫檔案(字尾名通常是.so即shared object),Linux中可執行程式和字尾名無關,甚至可以沒有後綴。

[root@centos8 ~]# file /bin/ls  # 使用file命令檢視ls程式的執行格式
/bin/ls: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=f4154ce8a36c20d9aa270cc21c6b25ec026ac00f, stripped

因為每個作業系統(這裡指的是windows和linux)的ABI不同,也就意味著Windows上執行的程式(例如notepad.exe)不能在linux上執行,就像香港的插頭不能直接在國內使用。

  • API
    API(Application Programming Interface) 即應用程式程式設計介面,API定義了原始碼和庫之間的介面,開發人員在開發程式時可以呼叫系統提供的API來完成某些功能,因此同樣的原始碼可以支援在這個API的任何系統編譯。
    為了統一規範,國際電氣和電子工程師協會(IEEE)在作業系統上定義了一系列的API標準:POSIX(Portable Operating System Interface)即可移植的作業系統介面,實現了POSIX標準相容的程式可以在其他POSIX作業系統編譯執行。
    高階程式語言(Java,Go,Python)已經實現了完全的跨平臺,遮蔽了作業系統的差異,實現一次編寫,到處編譯\解釋執行。

使用者態和核心態

計算機硬體資源都是作業系統核心進行管理,目前的作業系統都是基於多工,多使用者的。如果每個使用者程序都可以隨意訪問作業系統的核心模組,改變狀態,那麼整個系統的穩定性、安全性都大大降低。
為了讓核心程式與使用者程式隔離開,在硬體層面上提供了一個機制,將程式執行的狀態分成了不同的級別,從Ring 0到Ring 3,數字越小,訪問級別越高。Ring 0代表核心態,在該特權級別下,所有記憶體上的資料都是可見的,可訪問的。Ring 3代表使用者態,在這個特權級下,程式只能訪問一部分的記憶體區域,只能執行一些特定的指令。

如果應用程式想要訪問硬體資源,此時需要傳送請求給核心,由核心和硬體的互動。

庫函式和系統呼叫

對於非一般性使用需求,作業系統提供了一系列的函式呼叫給軟體開發者,由軟體開發者來實現一些使用者需要的功能。這些函式呼叫由於是作業系統核心提供的,為了區別於一般的函式呼叫,被稱為系統呼叫。
比如使用C語言進行軟體開發時,經常使用的printf()函式,它的內部實際上就是通過write這個系統呼叫,讓作業系統核心把字元列印在螢幕上。

庫函式和系統呼叫

使用者空間和核心空間

  • 使用者空間(User Space) 表示使用者程式的執行空間,為了安全,使用者空間和核心空間是隔離的,即使使用者的程式崩潰,也不會影響核心。使用者空間只能執行簡單的運算,不能直接呼叫系統資源,必須通過系統介面(system call) 才能向核心發出指令。
  • 核心空間(Kernel Space) 表示核心的執行空間,可以執行任意指令,呼叫系統的一切資源。


使用者空間和核心空間

下面以一段C語言程式碼片段來說明使用者空間和核心空間

str ="www.ittimeline.net";
x=100;
x=x+100;
file.write(str);
y=x+200

第1,2,3行都是簡單的賦值操作,直接在使用者空間執行,第四行需要寫入檔案,就需要切換到核心空間,因為使用者不能直接寫檔案,需要通過核心來執行。第五行又是賦值運算,需要從核心空間切換回使用者空間。核心空間和使用者空間的切換需要消耗資源。

淺談程式語言

程式語言經歷過機器語言,組合語言和高階語言的發展歷史

如果想要在Linux下開發應用程式,就需要掌握某種高階程式語言,例如C/C++/Java/Python/Go/Ruby等等。高階語言都需要經過編譯器/直譯器來將高階語言編寫的源程式編譯/解釋成計算機能識別的機器語言後執行。
其中Linux核心和硬體驅動使用C語言和少數組合語言開發的,組合語言將機器指令使用英文代替,無法移植。而Linux系統的應用是使用C/C++/Java/Python/Go/Ruby語言開發的。

想要高薪就業、在IT行業長久發展,必須掌握系統運維與應用開發、測試。運維開發語言首推Python,Go,而大型分散式網際網路應用(電商、金融、支付、物流)首選語言是Java,測試人員首選Python,運維開發首選python和go。