強烈推薦|你不可不知的效能優化內幕
一. 基本概念
1. 軟體系統質量特性
安全性:同時兼顧向合法使用者提供服務,以及阻止非授權使用軟體及資源的能力。
健壯、可靠:軟體系統在一定的時間內無故障執行的能力、容錯能力、恢復能力
可擴充套件、可維護、可移植:正在執行的軟體系統以適應新需求、變化了的需求的難易程度
可用性、易用性、效能:效能是指軟體及時提供相應服務的能力。 具體而言, 效能包括速度、 吞吐量和持續高速性三方面的要求 。
2. 效能的定義及表現
定義:多快給使用者想要的結果;主要考察流暢度和更少的資源佔用兩個方面
表現:一些頁面載入超過3秒,就會影響使用者體驗,從而流失使用者,所以我們的業務計算結果越快出來越好
二、效能優化涉及的範圍
1. 範圍
(1)硬體環境範圍
單機:CPU、記憶體、磁碟、網路
多機:儲存架構、網路架構、應用架構
(2)軟體環境範圍:JVM、TOMCAT、資料庫、軟體系統(我們的寫的程式程式碼)都是可以優化的地方
(3)應用場景
計算密集型,集中式資源使用
IO密集型,分散型資源利用
說明:我們程式設計師一般關注的是軟體環境範圍的效能優化,但是前提是硬體環境不要太苛刻,比如我們的軟體啟動就需要512M的記憶體,結果硬體環境只有128M的記憶體,這樣即使再怎麼優化也是達不到要求的
2. 效能是平衡之道
即在有限的資源下,提供最佳的訪問能力及處理速度。木桶原理之:發現最差瓶頸,提升整體效率。呑吐量和響應速度兼顧。
3. 調優是量體裁衣
根據不同的場景,針對性的提高適用性。如:前臺的響應速度,後臺的統計結果。前者使用者耐心有限,後者需要豐富資料分析。
4. 效能優化的一些術語
QPS:每秒查詢次數
TPS:每秒事務次數
呑吐量:單位時間內成功地傳送資料的數量
響應時間:使用者請求到使用者接收結果的時間。
5. 效能瓶頸
網路IO,阻塞式IO是最大的問題
網路:頻寬問題,CDN問題,我們在進行效能優化時,首先要排查是不是頻寬和CDN的問題
6. 運維監控
1. 瞭解一下基本的運維相關的命令,知道怎麼使用
1.1 top
說明:top命令用來顯示執行中的程式程序,使用許可權是所有使用者。按q鍵退出
格式:top [-] [d delay] [q] [c] [S] [s] [i] [n]
主要引數:
d:指定更新的間隔,以秒計算。
q:沒有任何延遲的更新。如果使用者有超級使用者,則top命令將會以最高的優先序執行。
c:顯示程序完整的路徑與名稱。
S:累積模式,會將己完成或消失的子行程的CPU時間累積起來。
s:安全模式。
i:不顯示任何閒置(Idle)或無用(Zombie)的行程。
n:顯示更新的次數,完成後將會退出top。
命令圖解:
第一行表示的專案依次為當前時間、系統執行時間、當前系統登入使用者數目、1/5/10分鐘系統平均負載(一般來說,這個負載值應該不太可能超過 1 才對,除非您的系統很忙碌。 如果持續高於 5 的話,那麼.....仔細的看看到底是那個程式在影響整體系統吧!)。
第二行顯示的是所有啟動的程序、目前執行、掛起 (Sleeping)的和無用(Zombie)的程序。(比較需要注意的是最後的 zombie 那個數值,如果不是 0 ,嘿嘿!好好看看到底是那個 process 變成疆屍了吧?!)(stop模式:與sleep程序應區別,sleep會主動放棄cpu,而stop是被動放棄cpu ,例單步跟蹤,stop(暫停)的程序是無法自己回到執行狀態的)
第三行顯示的是目前CPU的使用情況,包括us使用者空間佔用CPU百分比、sy 核心空間佔用CPU百分比、ni 使用者程序空間內改變過優先順序的程序佔用CPU百分比(中斷處理佔用)、id 空閒CPU百分比、wa 等待輸入輸出的CPU時間百分比、hi,si,st 三者的意思目錄還不清楚 :)
第四行顯示實體記憶體的使用情況,包括總的可以使用的記憶體、已用記憶體、空閒記憶體、緩衝區佔用的記憶體。
第五行顯示交換分割槽使用情況,包括總的交換分割槽、使用的、空閒的和用於快取記憶體的大小。
第六行顯示的專案最多,下面列出了詳細解釋。
PID(Process ID):程序標示號 ( 每個 process 的 ID )
USER:程序所有者的使用者名稱 ( 該 process 所屬的使用者 )
PR:程序的優先級別 ( Priority 的簡寫,程式的優先執行順序,越小越早被執行 )
NI:程序的優先級別數值 ( Nice 的簡寫,與 Priority 有關,也是越小越早被執行 )
VIRT:程序佔用的虛擬記憶體值。
RES:程序佔用的實體記憶體值。
SHR:程序使用的共享記憶體值。
S:程序的狀態,其中S表示休眠,R表示正在執行,Z表示僵死狀態,N表示該程序優先值是負數。
%CPU:該程序佔用的CPU使用率。
%MEM:該程序佔用的實體記憶體和總記憶體的百分比。
TIME+:該程序啟動後佔用的總的CPU時間 ( CPU 使用時間的累加 )
Command:程序啟動的啟動命令名稱,如果這一行顯示不下,程序會有一個完整的命令列。
top命令使用過程中,還可以使用一些互動的命令來完成其它引數的功能。這些命令是通過快捷鍵啟動的。
<空格>:立刻重新整理。
P:根據CPU使用大小進行排序。
T:根據時間、累計時間排序。
q:退出top命令。
m:切換顯示記憶體資訊。
t:切換顯示程序和CPU狀態資訊。
c:切換顯示命令名稱和完整命令列。
M:根據使用記憶體大小進行排序。
W:將當前設定寫入~/.toprc檔案中。這是寫top配置檔案的推薦方法
1.2 free
說明:free命令用來顯示記憶體的使用情況,使用許可權是所有使用者。
格式:free [-b|-k|-m] [-o] [-s delay] [-t] [-V]
主要引數:
-b -k -m:分別以位元組、KB、MB為單位顯示記憶體使用情況。
-s delay:顯示每隔多少秒數來顯示一次記憶體使用情況。
-t:顯示記憶體總和列。
-o:不顯示緩衝區調節列。
使用示例:
free命令是用來檢視記憶體使用情況的主要命令。和top命令相比,它的優點是使用簡單,並且只佔用很少的系統資源。通過-S引數可以使用free命令不間斷地監視有多少記憶體在使用,這樣可以把它當作一個方便實時監控器。
#free -h -s5
1.3 df
說明:df命令的功能是用來檢查Linux伺服器的檔案系統的磁碟佔用情況。可以利用該命令來獲取磁碟被佔用了多少空間,目前還剩下多少空間等資訊。如果沒有指定檔名稱,則當前所有的被掛載的檔案系統的空間將被顯示。預設情況下,磁碟空間將以1kb位單位進行顯示。
格式:df 【選項】 【檔案】
命令引數:
-a 全部檔案系統的列表
-h 方便閱讀方式顯示
-i 顯示node資訊
-k 區塊為1024位元組
-l 只顯示本地檔案系統
-m 區塊為1048576位元組
-p 輸出格式為posix
-T 檔案系統型別
使用示例:
linux中df命令的輸出清單的第一列是代表的檔案系統對應的裝置檔案的路徑名稱(一般是硬碟上的分割槽);第二列給出的是資料塊的數目。第三四列分別代表已用的和可用的資料塊數量。也許使用者會感到奇怪的是兩者相加並不等於總的資料塊數,這是因為每個分割槽都預留了空間供管理員使用。即使遇到普通使用者空間已經滿的情況,管理員仍然留有可以登入和解決問題的空間。最後一列是檔案系統的掛載點。
1.4 du
說明:du命令檢視和計算目錄的大小
1.5 檢視日誌分析
cat /var/log/message,cat /var/log/nginx/access.log,cat /var/log/tomcat
2. 其他運維監控軟體
stat系列:vnstat,iostat,vmstat
三、處理模式
1. 調優順序
從底向上找出瓶頸,順序是伺服器優化——環境優化——資料庫優化——應用系統優化
2. 提高硬體能力
目標:買最好的機器,用最貴的網路,泡最靚的妞><
2.1 硬體配比
CPU與記憶體的比例,1:2或者1:4
磁碟空間及分割槽,多個盤(100G)
檔案系統格式及調優。Ext4
2.2 網路頻寬
公網5M頻寬,1000人以內內網頻寬。
2.3 系統環境
Nginx,安裝及配置
Tomcat
Mysql。
3. 提高系統處理能力
目標:安裝高效能的軟體、保障安全性、伺服器配置優化
安裝高效能的軟體:
WEB應用伺服器
Nginx
Tomcat
保障安全性:
防火牆,Centos自帶,一般不啟動selinux,使用VPS來設定
伺服器配置優化:
網路配置優化
連線數
ipv6
4. 伺服器環境安裝
Nginx:提高Tomcat靜態檔案處理能力、負載均衡、反向代理
Centos環境,安裝服務端軟體,統一採用yum方式
Yum install nginx
Yum install java-1.8.0-openjdk.x86_64
Yum install tomat
Yum install mariadb
5. 伺服器環境配置
Nginx的主配置目錄:/etc/nginx/
Nginx的server配置目錄:/etc/nginx/conf.d/
四、伺服器處理方法
1. 伺服器環境優化
網路優化、安全性配置、使用者組許可權、目錄規劃
2. 伺服器常規監控
命令:
Top命令
Free命令
Df命令
工具:
Xshell 連線linux操作介面
Filezilla 把檔案上傳到linux伺服器上,和xftp、winscp的工具類似
歡迎工作一到五年的Java工程師朋友們加入Java架構開發:744677563
群內提供免費的Java架構學習資料(裡面有高可用、高併發、高效能及分散式、Jvm效能調優、Spring原始碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!