記憶體效能瓶頸
首先,linux的記憶體管理是聰明和智慧的;
linux通過(virtual memory manage)來管理記憶體的; 對於大多數應用,linux是不直接寫到硬碟上去的,而是先寫到 virtual memory manage 管理的檔案系統快取(也在記憶體中的)裡 ,方便應用的後續的讀請求;因為和磁碟的I/O操作是昂貴的;linux會根據一些演算法策略適當的時候同步到硬碟的;這就是為什麼我們執行linux一段時間後,發現可用記憶體那麼少的原因,多數被cache+buffer佔用咧;
所以我們提高效能的辦法就是減少寫到磁碟的次數,提高每次寫磁碟時的效率質量;
機器記憶體使用情況監控:
1、良好狀態指標
swap in (si) == 0,swap out (so) == 0
應用程式可用記憶體/系統實體記憶體 <= 70%
2、監控工具 vmstat
$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 3 252696 2432 268 7148 3604 2368 3608 2372 288 288 0 0 21 78 1
0 2 253484 2216 228 7104 5368 2976 5372 3036 930 519 0 0 0 100 0
0 1 259252 2616 128 6148 19784 18712 19784 18712 3821 1853 0 1 3 95 1
1 2 260008 2188 144 6824 11824 2584 12664 2584 1347 1174 14 0 0 86 0
2 1 262140 2964 128 5852 24912 17304 24952 17304 4737 2341 86 10 0 0 4
重要引數:
swpd, 已使用的 SWAP 空間大小,KB 為單位;
free, 可用的實體記憶體大小,KB 為單位;
buff, 實體記憶體用來快取讀寫操作的buffer大小,KB 為單位;
cache, 實體記憶體用來快取程序地址空間的 cache 大小,KB 為單位;
si, 資料從 SWAP 讀取到 RAM(swap in)的大小,KB 為單位;
so, 資料從 RAM 寫到 SWAP(swap out)的大小,KB 為單位。
上例可得:
物理可用記憶體 free 基本沒什麼顯著變化,swapd逐步增加,說明最小可用的記憶體始終保持在 256MB(實體記憶體大小) * 10% = 2.56MB 左右,當髒頁達到10%的時候就開始大量使用swap。
這個10%來自" /proc/sys/vm/dirty_background_ratio "。
可調優效能引數:
1.、通過調節快取的髒資料同步到硬碟的策略:(髒資料表示沒有被當前的執行緒使用的資料)
例如: echo 10 > /proc/sys/vm/dirty_background_ratio (當髒資料佔據實體記憶體10%時,觸發pdflush同步到硬碟):
小心調節,會大幅度的影響效能;
echo 2000 > /proc/sys/vm/dirty_expire_centisecs (當髒資料在實體記憶體的逗留時間超過2000ms時被同步到硬碟);
2、通過調節swap引數,來優化linux虛擬記憶體管理:基於程式的區域性性原理,linux通過虛擬記憶體機制來實現併發執行程序,linux發現物理記憶體不夠用時,會根據LRU演算法將一部分記憶體swap out到硬碟;當執行被換出的那個執行緒時,在swap in 到記憶體裡;
例如: echo 10 > /proc/sys/vm/swappiness (值為0表示儘量都用實體記憶體,值為100表示積極的使用swap分割槽;)這個引數很重要;小心調節; 一般為60; ##在緊急處理線上問題時,可以緊急使用一下。
更多的引數:
linux效能調分析及調優—cpu 效能瓶頸調優可調效能引數 、記憶體效能瓶頸可調效能引數、磁碟I/O可調效能引數、網路可調效能引數 - 無影 - 激情、專注、堅持、思考
一、作業系統設定swap的目的
程式執行的一個必要條件就是足夠的記憶體,而記憶體往往是系統裡面比較緊張的一種資源。為了滿足更多程式的要求,作業系統虛擬了一部分記憶體地址,並將之對映到swap上。對於程式來說,它只知道作業系統給自己分配了記憶體地址,但並不清楚這些記憶體地址到底對映到實體記憶體還是swap。實體記憶體和swap在功能上是一樣的,只是因為物理儲存元件的不同(記憶體和磁碟),效能上有很大的差別。作業系統會根據程式使用記憶體的特點進行換入和換出,儘可能地把實體記憶體留給最需要它的程式。但是這種排程是按照預先設定的某種規則的,並不能完全符合程式的需要。
一些特殊的程式(比如MySQL)希望自己的資料永遠寄存在實體記憶體裡,以便提供更高的效能。於是作業系統就設定了幾個api,以便為呼叫者提供“特殊服務”。
二、Linux提供的幾個api
1、mlockall()和munlockall()
這一對函式,可以讓呼叫者的地址空間常駐實體記憶體,也可以在需要的時候將此特權取消。mlockall()的flag位可以是MCL_CURRENT和MCL_FUTURE的任意組合,分別代表了“保持已分配的地址空間常駐實體記憶體”和“保持未來分配的地址空間常駐實體記憶體”。對於Linux來說,這對函式是非常霸道的,只有root使用者才有許可權呼叫。
2、shmget()和shmat()
這一對函式,可以向作業系統申請使用大頁記憶體(Large Page)。大頁記憶體的特點是預分配和永駐實體記憶體,因為使用了共享記憶體段的方式,page table有可能會比傳統的小頁分配方式更小。
對於多程序共享記憶體的程式(比如Oracle),大頁記憶體能夠節省很多page table開銷;
而對於mysql來說,效能和資源開銷都沒有顯著變化,好處就在於減少了記憶體地址被對映到swap上的可能。至於為什麼是減少,而不是完全避免,之後再講解。
3、O_DIRECT和posix_memalign()
以上兩個方法都不會減少記憶體的使用量,呼叫者的本意是獲取更高的系統特權,而不是節約系統資源。
O_DIRECT是一種更加理想化的方式,通過避免double buffer,節省了檔案系統cache的開銷,最終減少swap的使用率。O_DIRECT是Linux IO排程相關的標誌,在open函式裡面呼叫。通過O_DIRECT標誌開啟的檔案,讀寫都不會用到檔案系統的cache。
傳統的資料庫(oracle、MySQL)基本都有O_DIRECT相關的開關,在提高效能的同時,也減少了記憶體的使用。至於posix_memalign(),是用來申請對齊的記憶體地址的。只有用posix_memalign()申請的記憶體地址,才能用來讀寫O_DIRECT模式下的檔案描述符。
4、madvise()和fadvise()
這對函式也是比較溫和的,可以將呼叫者對資料訪問模式的預期傳遞給Linux,以期得到更好的效能。
我們比較感興趣的是MADV_DONTNEED和FADV_NOREUSE這兩個flag。前者會建議Linux釋放指定的記憶體區域,而後者會建議檔案系統釋放指定檔案所佔用的cache。
當mysql出現記憶體導致的效能瓶頸時,可以:
1、/proc/sys/vm/swappiness的內容改成0(臨時),/etc/sysctl.conf上新增vm.swappiness=0(永久)
這個引數決定了Linux是傾向於使用swap,還是傾向於釋放檔案系統cache。在記憶體緊張的情況下,數值越低越傾向於釋放檔案系統cache。當然,這個引數只能減少使用swap的概率,並不能避免Linux使用swap。
2、修改MySQL的配置引數innodb_flush_method,開啟O_DIRECT模式。
這種情況下,InnoDB的buffer pool會直接繞過檔案系統cache來訪問磁碟,但是redo log依舊會使用檔案系統cache。值得注意的是,Redo log是覆寫模式的,即使使用了檔案系統的cache,也不會佔用太多。
3、新增MySQL的配置引數memlock
這個引數會強迫mysqld程序的地址空間一直被鎖定在實體記憶體上,對於os來說是非常霸道的一個要求。必須要用root帳號來啟動MySQL才能生效。
4、還有一個比較複雜的方法,指定MySQL使用大頁記憶體(Large Page)。Linux上的大頁記憶體是不會被換出實體記憶體的,和memlock有異曲同工之妙。具體的配置方法可以參考:http://harrison-fisk.blogspot.com/2009/01/enabling-innodb-large-pages-on-linux.html
磁碟I/O可調效能引數
linux的子系統VFS(virtural file system)虛擬檔案系統;從高層將各種檔案系統,以及底層磁碟特性隱藏,對程式設計師提供:read,write,delete等檔案操作;這就是之所以我們可以在linux上mount多種不同格式的檔案系統的,而window確不行;
當然基於:虛擬檔案系統,檔案系統,檔案系統驅動程式,硬體特性方面,都能找到效能瓶頸;
1、選擇適合應用的檔案系統;
2.、調整程序I/O請求的優先順序,分三種級別:1代表 real time ; 2代表best-effort; 3代表idle ;
如:ionice -c1 -p 1113(給程序1113的I/O優先順序設定為最高優先順序)
3、根據應用型別,適當調整page size 和block size;
4、升級驅動程式;
第四節 :網路可調效能引數
對於我們web應用來說,網路效能調整如此重要,linux的網路支援是無與倫比的;是作為網路伺服器的首先;對於web服務來說:除了應用的響應速度外,linux網路管理子系統,網絡卡,頻寬都可能成為效能瓶頸;
網路引數可以在/proc/sys/net/ipv4/ 下面的檔案中進行配置。
可以檢視和設定的引數:
1、檢視網絡卡設定是否全雙工傳輸的: echtool eth0
2.、設定MTU(最大傳輸單元),在頻寬G以上的時候,要考慮將MTU增大,提高傳輸效能;
如: ifconfig eth0 mtu 9000 up
如果資料包的長度大於mtu的長度時,很容易出現丟包情況。
3.、增加網路資料快取;傳輸資料時linux是將包先放入快取,填滿快取後即傳送出去;讀操作類似;
sysctl -w net.ipv4.tcp_rmem="4096 87380 8388608" :設定tcp讀快取:最小快取,初始化時,最大快取
sysctl -w net.ipv4.tcp_wmem="4096 87380 8388608" :設定tcp寫快取:最小快取,初始化時,最大快取
由於是先將資料放入快取再發送,或收取收據,那麼當記憶體緊張或記憶體不夠用時,網路丟包就可能出現。
4、禁用window_scaling,並且直接設定window_size;(就像我們經常設定jvm的引數:xms = xmx一樣
sysctl -w net.ipv4.tcp_window_scaling=0
5、設定TCP連線可重用性: 對於TIME_OUT狀態的TCP連線可用於下一個TCP重用,這樣減少了三次握手和建立時間,非常提高效能,尤其對於web server;
如: 開啟可重用tcp功能: sysctl -w net.ipv4.tcp_tw_reuse=1 sysctl -w net.ipv4.tcp_tw_recyle=1
6、禁用掉沒必要的tcp/ip協議功能:比如icmp;broadcast包的接收;
7、linux對於keeplive的tcp連線有一個預設的過期時間;可以減小這個時間,讓沒用的連線釋放掉,畢竟tcp連線數是有限的嘛;
如: sysctl -w net.ipv4.tcp_keepalive_time=1800 (設定過期時間,1800s)
8、設定最大tcp正在連線狀態(還沒ESTABLISHED)佇列長度;避免由於太多的tcp連線過來,導致伺服器掛掉;比如DoS攻擊
如:sysctl -w net.ipv4.tcp_max_syn_backlog=4096
9、 繫結tcp型別的中斷到一個cpu上;(讓cpu去親和這個型別中斷,避免頻繁的中斷,影響執行緒排程效能)
總結: 我們在效能優化一個應用時,首要的是設定優化要達到的目標,然後尋找瓶頸,調整引數,達到優化目的;但是尋找瓶頸時可能是最累的,要從大範圍,通過很多用例,很多測試報告,不斷的縮小範圍,最終確定瓶頸點;以上這些引數只是個認識,系統性能優化中可能用到,但並不是放之四海而皆準的; 有的引數要邊測試,邊調整的;
相關推薦
liunx 優化及效能調優
cpu 效能瓶頸 計算機中,cpu是最重要的一個子系統,負責所有計算任務; 基於摩爾定律的發展,cpu是發展最快的一個硬體,所以瓶頸很少出現在cpu上; 我們線上環境的cpu都是多核的,並且基於SMP(symmetric multiprocessing)結構的。 通
Tomcat-Jdbc-Pool配置及效能調優
1. maxActive="100"表示併發情況下最大可從連線池中獲取的連線數。 2、maxIdle="30"如果在併發時達到了maxActive=100,那麼連線池就必須從資料庫中獲取100個連線來供應用程式使用,當應用程式關閉連線後,由於maxIdle=30,因此並不是
Nginx動靜分離及效能調優實踐
直接看配置檔案!直接看配置檔案!直接看配置檔案! #user nobody; worker_processes 8; #error_log logs/error.log; #error_log logs/error.log notice; #error_log
JVM垃圾回收分代機制及效能調優
JVM Specification中的JVM整體架構 主要包括兩個子系統和兩個元件,Class Loader(類裝載)子系統,Execution Engine(執行引擎)子系統,Runtime Data Area(執行時資料區)元件,Native Interface(本地介面)元件。 Cl
MySQL高併發優化,效能調優要這麼來~
一、資料庫結構的設計 表的設計具體注意的問題: 1、資料行的長度不要超過 8020 位元組,如果超過這個長度的話在物理頁中這條資料會佔用兩行從而造成儲存碎片,降低查詢效率。 2、能夠用數字型別的欄位儘量選擇數字型別而不用字串型別的(電話號碼),這會降低查詢和連線的效能,並會增加儲存開銷。這是因為引擎
Spark商業案例與效能調優實戰100課》第3課:商業案例之通過RDD分析大資料電影點評系各種型別的最喜愛電影TopN及效能優化技巧
Spark商業案例與效能調優實戰100課》第3課:商業案例之通過RDD分析大資料電影點評系各種型別的最喜愛電影TopN及效能優化技 原始碼 package com.dt.spark.core
網站高併發優化效能調優總結
最近在對PHP網站高併發高效能有所領悟,今天寫一篇關於這方面的文章。今天用我的測試站點:http://zhimo.yuanzhumuban.cc/來講解例項。 支模網整體開發到上線為10個月左右,後端採用php開源框架destoon,站點總資料為800萬,其中每天會更新入庫資料5000-50000資料不等,
MySQL效能優化總結___本文乃《MySQL效能調優與架構設計》讀書筆記!
一、MySQL的主要適用場景 1、Web網站系統 2、日誌記錄系統 3、資料倉庫系統 4、嵌入式系統 二、MySQL架構圖: 三、MySQL儲存引擎概述 1)MyISAM儲存引擎 MyISAM儲存引擎的表在資料庫中,每一個表
轉 Spark效能優化:資源調優篇
前言 在開發完Spark作業之後,就該為作業配置合適的資源了。Spark的資源引數,基本都可以在spark-submit命令中作為引數設定。很多Spark初學者,通常不知道該設定哪些必要的引數,以及如何設定這些引數,最後就只能胡亂設定,甚至壓根兒不設定。資源引數設定的不合理,可能會導致沒
Dubbo效能調優引數及原理
Dubbo呼叫模型 常用效能調優引數 原始碼及原理分析 threads FixedThreadPool.java public Executor getExecutor(URL url) { Stri
Spark效能優化:開發調優篇
在大資料計算領域,Spark已經成為了越來越流行、越來越受歡迎的計算平臺之一。Spark的功能涵蓋了大資料領域的離線批處理、SQL類處理、流式/實時計算、機器學習、圖計算等各種不同型別的計算操作,應用範圍與前景非常廣泛。 然而,通過Spark開發出高效能的大
Spark效能優化:資源調優篇
在開發完Spark作業之後,就該為作業配置合適的資源了。Spark的資源引數,基本都可以在spark-submit命令中作為引數設定。很多Spark初學者,通常不知道該設定哪些必要的引數,以及如何設定這些引數,最後就只能胡亂設定,甚至壓根兒不設定。資源引數設定的不合理,可能會
mysql效能調優筆記(二)--查詢優化和索引
一、Mysql執行查詢流程 mysql執行查詢的流程 mysql執行查詢內部路程:1.客服端傳送一條查詢給伺服器
Qt連線MySQL程式設計及資料庫效能調優(一)
之前整理過一篇Qt下資料庫程式設計基礎 :最近在進行單元測試,所以把遇到的一些問題整理出來,主要是關於資料庫的 1.遠端連線資料庫 連線語句是: mysql -h 192.168.xx.xx(IP地址) -P 3306(埠) -u remoteuser(登入使用
效能調優之MySQL篇三:MySQL配置定位以及優化
1、優化方式 一般的優化方法有:硬體優化,配置優化,sql優化,表結構優化。下面僅僅介紹配置優化,具體優化設定可以參考本人另外一篇部落格,傳送門:https://www.cnblogs.com/langhuagungun/p/9507206.html 2、mysql配置分析 1)常見瓶頸 90%系統瓶
效能調優之MySQL篇四:MySQL配置定位以及優化
一、CPU最大效能模式 cpu利用特點 5.1 最高可用4個核 5.5 最高可用24核 5.6 最高可用64核心 一次query對應一個邏輯CPU 你仔細檢查的話,有些伺服器上會有的一個有趣的現象:你cat /proc/cpuinfo時,會發現CPU的頻率竟然跟它標
JVM記憶體管理及JAVA效能調優相關筆記
JVM篇 1.JVM記憶體分配:方法區、Java棧、本地方法棧、堆、程式計數器。方法區:在方法區中,儲存了每個類的資訊(包括類的名稱、方法資訊、欄位資訊)、靜態變數、常量以及編譯器編譯後的程式碼等。Java棧:用來儲存方法中的區域性變數(包括在方法中宣告的非靜態變數以及函式形參)。對於基本資料型別的
Spark效能調優---fastutil優化資料格式
Spark中應用fastutil的場景: 1、如果運算元函式使用了外部變數;那麼第一,你可以使用Broadcast廣播變數優化;第二,可以使用Kryo序列化類庫,提升序列化效能和效率;第三,如果外部變數是某種比較大的集合,那麼可以考慮使用fastutil改寫外部變數,首先從源頭上就減少記憶體的佔
OLTPBenchmark配置及OLTP效能調優
配置OLTPBenchmark並進行效能調優 安裝依賴 PostgreSQL 首先安裝PostgreSQL,本測試系統為Ubuntu,請參考這裡。 您可以通過psql像postgres使用者sudo一樣執行單個命令來完成此操作,如下所示: sudo -u pos
轉【Zabbix效能調優:配置優化】
轉載:https://sre.ink/zabbix-turn-conf/ #通過日誌可以分析當前服務狀態。LogFile=/tmp/zabbix_server.log #日誌檔案路徑。LogFileSize=1 #日誌檔案最大值(MB),超過則滾動,設為0表示不回滾。DebugLevel=3 #除錯日誌級別