首先一個基本概念: 存儲系統存儲速度的快->慢: 內存->閃存->磁盤node
由於內存的價格限制以及操做系統支持的限制,咱們只能從磁盤這塊來看,可見磁盤正是存儲系統的最大瓶頸所在。
linux
緩存分爲3類 Filestem cache、Diskcache、Disk controller cache。這裏從磁盤部分來看,它包括了緩存數據。預讀。回寫。算法
緩存嘗試用LRU算法、即近最少使用算法顧名思義。
數據庫
寫入緩存,即IO命令並不馬上的去執行,而是先在緩存中合併,相同的合爲一個連續的合爲一體,把隨機寫IO變成連續寫。這樣作的直接做用減小了尋址浪費時間從而有效提升效率
緩存
緩存的大小設置問題:不能太大了由於成本!!硬傷所在。。bash
小了呢他相對於大的存儲系統就顯的不夠看,並且你要找一個東西他不在緩存裏系統還要去緩存尋址一次。這樣作的太多天然下降了效率。
服務器
[#1#root@localhost ~]#free -m
Total// used free shared buffers cache
物理內存總量 已使用內存量 空閒內存 多個進程的共享內存 元數據緩存 塊數據緩存
Mem: 490 132 357 0 7 38
-/+ buffers/cache: 87 402
從應用程序角度看 used 系統自己佔用87=132(實際已使用)-buffer(7)- cache(38)
Free 系統當前空閒的內存量=就是free的把緩存的都算上
----------------------------------------------------------------------------------------------------
Swap: 511 0 511 //swap空閒內存夠用因此都是free網絡
我的總結:從應用程序上看,在他們眼裏只是單純的可用就好,以爲緩存是更快的內存的因此他認爲可用內存包括緩存。因此他麼也並不知道系統實際佔用的內存。而一樣由於可用就好,他認爲系統自己佔的 就是已使用內存減去能夠利用的緩存,也就是系統運行必要的內存,他們不能觸碰。 --以爲本身可能簡單問題複雜化了可真是想的很暈。數據結構
簡單記住公式 used-緩存 free+緩存就行了工具
linux系統中buffer 和cache的區別,首先粗略的認爲cache是第一次讀取後纔有的,而buffer是系統爲你預先準備好的。
緩存(cached)是把讀取過的數據 保存起來,從新讀取時若命中(找到須要的數據)就不要去讀硬盤了,若沒有命中就讀硬盤。其中的數據會根據讀取頻率進行組織,把最頻繁讀取的內容放在最容易找到的位置,把再也不讀的內容不斷日後排,直至從中刪除。 緩衝(buffers)是根據磁盤的讀寫 設計的,把分散的寫操做集中進行,減小磁盤碎片和硬盤的反覆尋道,從而提升系統性能。
如下是手動清空緩存的方法:(緩存被佔用是正常的系統現象,清空緩存空間會
形成系統IO 異常,慎用。)
清空page cache
#echo 1 > /proc/sys/vm/drop_caches
清空buffer cache
#echo 2 > /proc/sys/vm/drop_caches
清空全部cache
#echo 3 > /proc/sys/vm/drop_caches
之前都說swap是物理內存的兩倍,但是如今的內存都很大 什麼16G啊 32G啊。你整64G swap?那樣作只是並無什麼用。。。。。
根據磁盤的特色,咱們知道越是靠磁盤外部的柱面,旋轉越快,並且每次旋轉時,磁盤讀寫頭能夠覆蓋較多的區域,也就意味着靠外部的柱面能夠獲得較好的性能。因此在分區時,咱們應該考慮將訪問頻率高的,對系統性能影響相對較大的分區置於磁盤的靠外部分。同時,爲了減小磁盤碎片,應將內容常常改變的目錄放在單獨的分區。從方便備份數據的角度考慮,由於不少備份工具對整個分區進行備份的效率要高,因此咱們應將Linux系統的幾個主要的目錄做爲單獨的文件系統,爲它們各自分配一個區。推薦的分區策略如圖一:
若是你的系統有多塊硬盤,能夠考慮使用多個交換分區。每一個磁盤上劃分一個交換分區。經過在/etc/fstab文件中設置pri 選項,可以使多個交換分區具備一樣的優先級。Linux系統便可並行地使用它們。這樣便可提升交換分區的性能。
/dev/hda5 swap swap defaults,pri=5 0 0 /dev/hdc5 swap swap defaults,pri=5 0 0
固然,若是你的系統內存足夠大,而你的系統又遠遠用不了那麼多的內存,那也就用不到什麼虛存了。分區時你就能夠考慮去掉交換分區。不過做爲一個Linux服務器,即便你的內存足夠大,仍是應該設置交換分區。
raid不作詳述。
建立文件系統時,能夠指定塊的大小。若是未來在你的文件系統中是一些比較大的文件的話,使用較大的塊大小將獲得較好的性能。將ext2文件系統的塊大小調整爲4096byte而不是缺省的1024byte,能夠減小文件碎片,加快fsck掃描的速度和文件刪除以及讀操做的速度。另外,在ext2的文件系統中,爲根目錄保留了5%的空間,對一個大的文件系統,除非用做日誌文件,5%的比例有些過多。可使用命令"# mke2fs -b 4096 -m 1 /dev/hda6"將它改成1%並以塊大小4096byte建立文件系統。
使用多大的塊大小,須要根據你的系統綜合考慮,若是系統用做郵件或者新聞服務器,使用較大的塊大小,雖然性能有所提升,但會形成磁盤空間較大的浪費。好比文件系統中的文件平均大小爲2145byte,若是使用4096byte的塊大小,平均每個文件就會浪費1951byte空間。若是使用1024byte的塊大小,平均每個文件會浪費927byte空間。在性能和磁盤的代價上如何平衡,要看具體應用的須要。
咱們知道文件的建立,修改,訪問會有保存時間信息,咱們的頻繁反覆操做會對系統負載有一部分開銷。爲了提升系統的性能,咱們能夠在讀取文件時不修改文件的atime屬性。能夠經過在加載文件系統時使用notime選項來作到這一點。當以noatime選項加載(mount)文件系統時,對文件的讀取不會更新文件屬性中的atime信息。設置noatime的重要性是消除了文件系統對文件的寫操做,文件只是簡單地被系統讀取。因爲寫操做相對讀來講要更消耗系統資源,因此這樣設置能夠明顯提升服務器的性能。注意wtime信息仍然有效,任什麼時候候文件被寫,該信息仍被更新。
好比在你的系統中,要爲/home文件系統設置notime選項,能夠修改/etc/fstab文件相應的行以下:
LABEL=/home /home ext2 noatime 1 2
要使該設置當即生效,可運行命令"#mount -oremount /home"。這樣之後系統讀取/home下的文件時將不會再修改atime屬性。
Linux內核中,包含了一些對於系統運行態的可設置參數。緩衝刷新的參數能夠經過調整 /proc/sys/vm/bdflush文件來完成,這個文件的格式是這樣的:
# cat /proc/sys/vm/bdflush 30 64 64 256 500 3000 60 0 0
每一欄是一個參數,其中最重要的是前面幾個參數。第一個數字是在"dirty"緩衝區達到多少的時候強制喚醒bdflush進程刷新硬盤,第二個數字是每次讓bdflush進程刷新多少個dirty塊。所謂dirty塊是必須寫到磁盤中的緩存塊。接下來的參數是每次容許bd flush將多少個內存塊排入空閒的緩衝塊列表。 以上值爲RedHat Linux 7.1中的缺省值。如何修改它們呢?對不一樣的系統有如下兩種方法
(1)# echo "100 128 128 512 5000 3000 60 0 0">/proc/sys/vm/bdflush 並將這條命令加到/etc/rc.d/rc.local文件中去。 (2)在/etc/sysctl.conf 文件中加入以下行: vm.bdflush = 100 128 128 512 5000 3000 60 0 0
以上的設置加大了緩衝區大小,下降了bdflush被啓動的頻度,同時也增長了萬一系統崩潰丟失數據的危險性。VFS的緩衝刷新是Linux文件系統高效的重要緣由之一,若是性能對你真的很重要,應該考慮調整這個參數。
在一個大型的網站服務器其中,可能Linux默認的同時可打開最大文件數不能知足系統須要,咱們能夠經過調整文件句柄數和i-節點數來增長系統的缺省的限制。不一樣的Linux內核版本有不一樣的調整方法。
在Linux內核2.2.x中能夠用以下命令修改:
# echo '8192' > /proc/sys/fs/file-max # echo '32768' > /proc/sys/fs/inode-max
並將以上命令加到/etc/rc.c/rc.local文件中,以使系統每次從新啓動時配置以上值。
在Linux內核2.4.x中須要修改源代碼,而後從新編譯內核才生效。編輯Linux內核源代碼中的 include/Linux/fs.h文件,將 NR_FILE 由8192改成 65536,將NR_RESERVED_FILES 由10 改成 128。編輯fs/inode.c 文件將 MAX_INODE 由16384改成262144。
通常狀況下,最大打開文件數比較合理的設置爲每4M物理內存256,好比256M內存能夠設爲16384,而最大的使用的i節點的數目應該是最大打開文件數目的3倍到4倍。
在Linux中能夠將一部份內存看成分區來使用,咱們稱之爲RamDisk。對於一些常常被訪問的文件,而它們又不會被更改,能夠將它們經過RamDisk放在內存中,便可明顯地提升系統的性能。固然你的內存可要足夠大了。RamDisk有兩種,一種能夠格式化,加載,在Linux內核2.0/2.2就已經支持,其不足之處是大小固定。另外一種是內核2.4才支持的,經過Ramfs或者tmpfs來實現,它們不能被格式化,可是用起來靈活,其大小隨所須要的空間而增長或減小。這裏主要介紹一下Ramfs和Tmpfs。
Ramfs顧名思義是內存文件系統,它工做於虛擬文件系統(VFS)層。不能格式化,能夠建立多個,在建立時能夠指定其最大能使用的內存大小。若是你的Linux已經將Ramfs編譯進內核,你就能夠很容易地使用Ramfs了。建立一個目錄,加載Ramfs到該目錄便可。
# mkdir -p /RAM1 # mount -t ramfs none /RAM1
缺省狀況下,Ramfs被限制最多可以使用內存大小的一半。能夠經過maxsize(以kbyte爲單位)選項來改變。
# mkdir -p /RAM1 # mount -t ramfs none /RAM1 -o maxsize=10000
以上即建立了一個限定了最大使用內存大小爲10M的ramdisk。
Tmpfs是一個虛擬內存文件系統,它不一樣於傳統的用塊設備形式來實現的ramdisk,也不一樣於針對物理內存的Ramfs。Tmpfs可使用物理內存,也可使用交換分區。在Linux內核中,虛擬內存資源由物理內存(RAM)和交換分區組成,這些資源是由內核中的虛擬內存子系統來負責分配和管理。Tmpfs就是和虛擬內存子系統來"打交道"的,它向虛擬內存子系統請求頁來存儲文件,它同Linux的其它請求頁的部分同樣,不知道分配給本身的頁是在內存中仍是在交換分區中。Tmpfs同Ramfs同樣,其大小也不是固定的,而是隨着所須要的空間而動態的增減。使用tmpfs,首先你編譯內核時得選擇"虛擬內存文件系統支持(Virtual memory filesystem support)" ,而後就能夠加載tmpfs文件系統了。
# mkdir -p /mnt/tmpfs # mount tmpfs /mnt/tmpfs -t tmpfs
爲了防止tmpfs使用過多的內存資源而形成系統的性能降低或死機,能夠在加載時指定tmpfs文件系統大小的最大限制。
# mount tmpfs /mnt/tmpfs -t tmpfs -o size=32m
以上建立的tmpfs文件系統就規定了其最大的大小爲32M。無論是使用ramfs仍是tmpfs,必須明白的是,一旦系統重啓,它們中的內容將會丟失。因此那些東西能夠放在內存文件系統中得根據系統的具體狀況而定。
若是Linux系統因爲意外狀況而沒有正常關機,則可能引發文件系統中某些文件的元數據(meta-data即和文件有關的信息,例如:權限、全部者以及建立和訪問時間)遭到破壞。文件系統須要維護文件的元數據來保證文件的可組織和可存取,若是元數據處於不合理或不一致的狀態,那麼就不能訪問和存取文件。當系統從新啓動時,fsck將掃描/etc/fstab文件中所列出的全部文件系統,確保它們的元數據處於可用的狀態。若是發現元數據不一致,fsck將掃描和檢測元數據,並糾正錯誤。若是文件系統很大,這個過程將須要很長的時間。爲解決這個問題,可使用日誌文件系統。日誌文件系統用獨立的日誌文件跟蹤磁盤內容的變化,在寫入文件內容的同時寫入文件的元數據。每次修改文件的元數據時,都要先向稱爲"日誌"的數據結構登記相應的條目。這樣,日誌文件系統就維護了最近更改的元數據的記錄。當加載日誌文件系統時,若是發現了錯誤,不會掃描整個文件系統的元數據,而是根據日誌檢查最近被更改的元數據。因此相對於傳統的文件系統(如ext2),日誌文件系統大大地加快了掃描和檢測的時間。
Linux下可用的日誌文件系統不少,如XFS,JFS,Reiserfs,ext3等等。日誌文件系統主要被設計爲服務器環境提供出色性能和高可用性。固然, Linux 工做站和家用機器也可從具備高性能的可靠日誌文件系統中獲益。安裝日誌文件系統,通常須要下載相應的壓縮包、爲內核打補丁、從新配置和從新編譯內核。 詳細的安裝過程可訪問相應文件系統的官方網站。
文件buffermen和內核虛擬內存子系統密切相關。文件/proc/sys/vm/buffermem控制多大內存被用於緩衝區(百分數表示)。內核2.4的缺省值爲:: "2 10 60"。能夠按以下方法修改:
# echo "70 10 60" >/proc/sys/vm/buffermem
並將之加到腳本文件/etc/rc.d/rc.local 中。或者在/etc/sysctl.conf文件中加入
vm.buffermem = 70 10 60
第一個參數 70意味着至少分配70%的內存用做緩衝區。後兩個參數保持系統的默認值。第一個參數設置爲多大合適,依賴於系統的內存大小和系統高負載時內存的使用狀況(可用free監視)。
Linux對於每一個用戶,系統限制其最大進程數。爲提升性能,能夠設置超級用戶root的最大進程數爲無限。編輯.bashrc文件(vi /root/.bashrc)增長行"ulimit -u unlimited"便可消除超級用戶的進程限制。
核心和系統對用戶進程其它的一些限制也能夠經過ulimit命令來查看和更改。"ulimit -a" 用來顯示當前的各類用戶進程限制。一些更改用戶限制的例子以下:
ulimit -n 4096 將每一個進程能夠打開的文件數目加大到4096,缺省爲1024
ulimit -m 4096 限制每一個進程使用的內存數。
將優化標誌放在/etc/profile文件中。在pentium III級的處理器上使用如下優化標誌將獲得最優的應用程序:
CFLAGS=-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-frame-pointer -fno-exceptions
再將以下行加到/etc/profile 更靠後的位置:
export PATH PS1 HOSTNAME HISTSIZE HISTFILESIZE USER LOGNAME MAIL INPUTRC CFLAGS LANG LESSCHARSET
使用以上的優化,gcc或者egcs編譯的程序將獲得最佳的性能。
編輯/usr/src/Linux/Makefile文件,能夠根據具體的cpu優化內核編譯。如下的參數設置將獲得優化的內核性能。
① vi +18 /usr/src/Linux/Makefile ,將HOSTCC =gcc改成 HOSTCC =egcs.
② vi +25 /usr/src/Linux/Makefile
將CC =$(CROSS_COMPILE)gcc D__KERNEL__ -I$(HPATH)
改成 CC =$(CROSS_COMPILE)egcs D__KERNEL__ -I$(HPATH).
③ vi +90 /usr/src/Linux/Makefile
將CFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
改成CFLAGS = -Wall -Wstrict-prototypes -O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-frame-pointer -fno-exceptions
④ vi +19 /usr/src/Linux/Makefile
將HOSTCFLAGS =-Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
改成HOSTCFLAGS =-Wall -Wstrict-prototypes -O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-frame-pointer -fno-exceptions
根據以上修改後的makefile文件從新編譯內核將獲得較優的性能。
Linux是一個靈活而又開放的系統。用戶能夠針對具體的應用環境,從系統的外圍到系統的 內核進行調優。系統的外圍的調優包括系統硬件的配置到系統安裝和系統服務的優化等。系統內核的調優包括參數的修改和改進系統的源代碼。咱們在針對用做db2數據庫服務器的Linux系統的調優中,針對db2數據庫的特色,按照本文的各個調優方面,另外還包括網絡的調優,對系統性能進行了綜合調優。在對調優後的系統的綜合測試來看,系統的性能有很大的改進。
改編自--51cto 原創做者 -鄧延軍