通俗的說法:
凡是硬盤上有對應的數(shù)據(jù),占用的內存,就是非計算內存,非計算內存需要被別的進程用到時,其中的數(shù)據(jù)無需page out,因為再次需要讀取的時候從硬盤文件中拿出來即可。
凡是硬盤上沒有數(shù)據(jù)對應的內存占用叫做計算內存,例如用C寫個程序,分配一塊1MB的內存,這部分內存不管其中數(shù)據(jù)是否有意義,硬盤上沒有文件對應,叫做計算內存。
以上所謂“硬盤上有無對應數(shù)據(jù)”的前提是:計算內存、非計算內存是操作系統(tǒng)的分類,所以操作系統(tǒng)知道硬盤上有對應,才叫非計算內存。雖然任何數(shù)據(jù)庫的內存占用絕大部分是磁盤緩沖,按理說其中的數(shù)據(jù)硬盤上有對應,但是,這些內存是數(shù)據(jù)庫管理的,操作系統(tǒng)只知道這些內存是DBMS主動向操作系統(tǒng)申請的,其中放的什么,操作系統(tǒng)并不知道,所以是計算內存。
breakdown:?計算內存、非計算內存都是指物理內存占用,而物理內存的情況,由于VMM機制,是時刻在變化的,所以只能說某一瞬間,計算內存、非計算內存各占用多少。
● 計算內存:
凡是進程/程序運行中用程序代碼向操作系統(tǒng)申請的內存,全部是計算內存,也就是說除非這個程序運行起來,除了自身代碼占用的內存,一點額外的內存也不用,否則它幾乎必然會造成計算內存占用的。說“幾乎”,是因為計算內存、非計算內存都是指物理內存,如果一個程序申請了1MB內存,但一段時間沒有用這部分內存,很可能在其他進程需要內存,且物理內存比較緊張時,按照LRU算法(Latest Recently Unused,最近最少使用),被操作系統(tǒng)部分或全部page out到paging space中,如果全部被page out了,可以說這個時刻,此進程沒有使用計算內存。換句話說,就是程序申請了1MB內存,那么它在某一時刻占用的計算內存從0字節(jié)~1MB都有可能。
進程主動向操作系統(tǒng)申請分配的內存,從程序編碼上來看,以C為例,典型的就是malloc,當然,還有程序語言中的隱式分配,反正對于操作系統(tǒng)來說都一樣,例如char *string1="ABCDEFG"; int number=22222; 前者會導致自動向操作系統(tǒng)申請8個字節(jié),后一個會申請一個字(兩個字節(jié))
當進程退出,或者意外崩潰,對于操作系統(tǒng)來說,它知道進程不在了,而進程申請的內存,操作系統(tǒng)明確知道是哪些的,在資源回收的過程中,會自動把這個進程申請的內存釋放掉,這個過程是很快的。所以我們可以看到:如果計算內存高企,我們把應用一停,也就是把使用計算內存最多的進程停止,計算內存占用率立刻就下來了。
● 非計算內存:
操作系統(tǒng)明確知道這部分內存的用途是放硬盤對應數(shù)據(jù)的,所以,顯然這部分內存不是任何進程可以控制,也就是說不可能一個程序主動要求分配多少非計算內存或者釋放多少。這部分完全是操作系統(tǒng)在直接管理:分配、記錄狀態(tài)、使用、釋放,其他進程只可能用間接手段影響非計算內存,例如讀寫文件。
非計算內存我們常見的是如下用途:
——程序代碼:當運行程序時,代碼初始裝入到物理內存的什么地方、重定位到什么地方,是操作系統(tǒng)管理的,它會記住程序代碼放在物理內存什么地方,及其對應程序文件的位置。當程序代碼占用的page frame需要被其他用途使用時,操作系統(tǒng)直接把這個page frame轉給要使用這部分內存的進程,并記錄標志,下次要是這個page原來的內容需要被引用,從對應程序文件中的對應位置讀取進入物理內存。有些進程的某些計算內存占用是不能被替換的,例如執(zhí)行VMM管理任務的操作系統(tǒng)核心進程,所以這部分會有操作系統(tǒng)機制設置標志,這個就是常說的pin住某些內存不準替換掉。
——磁盤訪問緩沖區(qū):這個不是常說的緩存區(qū),緩存區(qū)(英文Cache)的目的是用來提高性能,而緩沖區(qū)(英文Buffer),是為了塊設備訪問特點的要求,比如硬盤塊設備、邏輯卷塊設備,必須讀寫的基本單位是一個塊,一般是512字節(jié),哪怕你只讀寫一個字節(jié),也必須一次讀進512字節(jié),修改特定的那一個字節(jié),然后再整個512字節(jié)塊全部寫出到硬盤。這就需要緩沖區(qū)的存在。緩沖區(qū)的總個數(shù),是不固定的,操作系統(tǒng)可以根據(jù)同時在訪問的塊的數(shù)量隨時調整。
——NFS訪問緩沖區(qū),原理基本同上;
——文件系統(tǒng)緩存:這個肯定是每一個字節(jié)都有硬盤文件對應的,顯然是非計算內存。
限制 AIX 的 nocomp (非計算)內存最大值。
把 AIX 的
minperm% = 20
maxclient% = 80
maxperm% = 80
調整更低。
解決步驟:
查看原來的AIX的 minperm% 、 maxclient% 、 maxperm% 的值。如下:
Root 用戶查看:
>vmo –a
minperm% = 20
maxclient% = 80
maxperm% = 80
把 minperm% 設置成 10 , maxclient% 設置成 20 , maxperm% 設置成 20
用 root 命令行執(zhí)行:
1 、?vmo -p -o minperm%=10
2 、 vmo -p -o maxclient%=20
3 、 vmo -p -o maxperm%=20
備注:
minperm 和 maxperm 參數(shù)的值
操作系統(tǒng)通過把在曾經(jīng)讀寫的內存頁留在實內存一滿足不同要求。如果文件頁面在它們的頁幀被重新分配前被請求,那就節(jié)省了輸入輸出操作。該文件頁面可以來自本地的或遠程的(如 NFS )系統(tǒng)。
頁幀使用的文件相對用于計算的(工作或程序文本)段的文件的比例是松散地受控于 minperm 和 maxperm 的值的:
如果 RAM 中文件頁面所占的百分比高于 maxperm ,頁面替換的竊取只用于文件頁。
如果 RAM 中文件頁面所占的百分比低于 minperm ,頁面替換的竊取同時用于文件頁和計算頁。
如果 RAM 中文件頁面所占的百分比介于 minperm 和 maxperm 之間,頁面替換只竊取文件頁,除非文件頁的重調入數(shù)量大于計算頁數(shù)。
其中 Noncomp 在 20 %- 80 %之間,此時內存頁交換算法通常只交換文件緩存頁,但如果文件緩存頁的交換率大于程序頁時,程序頁也同樣被交換。由于 SGA 屬于 Comp 頁,數(shù)據(jù)文件緩存屬于 Noncomp 頁,而在數(shù)據(jù)大量訪問時,文件緩存頁的交換率大于程序頁( SGA ),因此大量的 SGA 頁面被交換;為避免大量 SGA 頁被交換,需要降低 maxperm% 值到 35 %以下,這樣就只有文件緩存頁面被交換,減少了 SGA 交換的次數(shù)。
來源:twt企業(yè)IT社區(qū)
免責聲明:本文內容由21ic獲得授權后發(fā)布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!