⑴ free
一個常見的問題是:
我的應用程式,伺服器,使用者以及系統進程等正在使用多少記憶體? 或者
現在多少記憶體可用?如果正在啟動並執行進程使用的記憶體大於可用RAM,則需要將這些進程移到交換區
因此,一個補充的問題是:
正在使用多少交換區空間?
free命令將回答所有這些問題。而且,一個非常有用的選項-m可以顯示可用記憶體(以MB為單位)
[root@Think ~]# free -m total used free shared buffers cachedMem: 1011 991 19 0 59 661-/+ buffers/cache: 270 740Swap: 0 0 0
以上輸出顯示系統具有1011MB的RAM,已使用991MB,還有19MB記憶體可用
第二行顯示在實體記憶體中緩衝區和緩衝大小的更改
第三行顯示交換分區利用情況
要以KB或GB為單位顯示以上內容,請將-m選項分別替換為-k或-g。使用-b選項將以位元組為單位
[root@Think ~]# free -b total used free shared buffers cachedMem: 1060110336 1039556608 20553728 0 62877696 692731904-/+ buffers/cache: 283947008 776163328Swap: 0 0 0
-t選項在輸出底部顯示總數(實體記憶體和交換分區的總和):
[root@Think ~]# free -m -t total used free shared buffers cachedMem: 1011 991 19 0 60 660-/+ buffers/cache: 270 740Swap: 0 0 0Total: 1011 991 19
儘管free不顯示百分比,但是我們可以提取並格式化輸出的特定部分
例如:已用記憶體佔總數的百分比
[root@Think ~]# free -m | grep Mem | awk '{print ($3 / $2)*100}'97.9228
這個值非常重要,您可能希望在可用記憶體的百分比低於特定閥值時觸發一個警報
同樣,要發現已使用交換分區空間的百分比,您可以:
[root@Think ~]# free -m | grep -i Swap | awk '{print ($3 / $2)*100}'
可以使用free查看應用程式施加的記憶體負載
例如,啟動備份應用程式之前檢查可用記憶體,啟動之後立即檢查可用記憶體
兩者之差就是備份應用程式消耗的記憶體
針對Oracle使用者的用法
那麼您如何使用該命令管理運行Oracle環境的Linux伺服器呢?
效能問題的一個最常見原因是記憶體不足,從而導致系統臨時將記憶體地區"交換"到磁碟中
某種程度的交換可能是必然的,但交換過多則表示可用記憶體不足
而現在,您可以使用free獲得可用記憶體資訊,緊接著使用sar命令(稍後介紹)檢查記憶體和交換分區的消耗的曆史趨勢
如果交換分區的使用是暫時的,則可能出現一個高峰,但如果明確要經過一段時間,則應要注意
持續的記憶體過載可能有幾個明顯且可能的疑點:
● 較大的SGA高於可用記憶體
● 在PGA上分配了大量記憶體
● 某些進程出現泄漏記憶體的錯誤
對於第一種情況,應確保SGA低於可用記憶體,根據經驗,對SGA使用大約是實體記憶體的40%,當然,應該根據具體情況定義該參數
對於第二種情況,應嘗試減少查詢中的大量緩衝區的分配
對於第三種情況,應使用ps命令確定可能泄露記憶體的具體進程
⑵ ipcs
當某個進程運行時,它會奪取"共用記憶體"
該進程可能擁有一個或很多個共用記憶體段
進程之間彼此發送訊息並使用訊號
要顯示有關共用記憶體段,IPC訊息佇列以及訊號的資訊,可以使用一個命令:
ipcs
-m選項非常受歡迎,他能顯示共用記憶體段
[root@Think ~]# ipcs -m------ Shared Memory Segments --------key shmid owner perms bytes nattch status 0x7402f3d8 4620288 root 600 4 0 0x00000000 4980737 root 644 52 2 0x7402f3d7 4587522 root 600 4 0 0x00000000 5013507 root 644 16384 2 0x00000000 5046276 root 644 268 2 0x00000000 5111813 root 600 393216 2 dest 0x00000000 5144582 root 600 393216 2 dest 0x00000000 5177351 root 600 393216 2 dest 0x00000000 5439503 root 600 393216 2 dest 0x00000000 5472272 root 600 393216 2 dest 0xbe3bb918 5505041 oracle 640 419438592 20
該輸出表明伺服器正在運行Oracle軟體,顯示了各種共用記憶體段
每個共用記憶體段由顯示在"shmid"列下面的共用記憶體ID唯一標識(稍後,您將看到如何使用該值)
顯然,"owner"顯示記憶體段的所有者,"perms"列顯示許可權,"bytes"顯示位元組大小
-u選項顯示一個非常快速的摘要
[root@Think ~]# ipcs -mu------ Shared Memory Status --------segments allocated 18pages allocated 103562pages resident 36482pages swapped 0Swap performance: 0 attempts 0 successes
-l顯示限定值(相對於當前值):
[root@Think ~]# ipcs -ml------ Shared Memory Limits --------max number of segments = 4096max seg size (kbytes) = 524288max total shared memory (kbytes) = 8388608min seg size (bytes) = 1
如果您看到當前值處於或接近限定值,則應該考慮提高限定值
可以使用shmid值擷取具體共用記憶體段的詳細快照,-i選項可以完成該操作
下面是查看shmid 5505041 詳細資料的方法:
[root@Think ~]# ipcs -m -i 5505041Shared memory Segment shmid=5505041uid=501 gid=502 cuid=501 cgid=502mode=0640 access_perms=0640bytes=419438592 lpid=10881 cpid=5300 nattch=20att_time=Sun Feb 3 20:58:28 2013 det_time=Sun Feb 3 20:58:28 2013 change_time=Sun Feb 3 09:08:06 2013
稍後,本文將採用一個案例向您介紹如何解釋以上輸出
-s顯示系統中的訊號:
[root@Think ~]# ipcs -s------ Semaphore Arrays --------key semid owner perms nsems 0x000000a7 0 root 600 1 0xf5d4b884 131073 oracle 640 154
他顯示一些有價值的資料,顯示ID為0的訊號組具有1個訊號,另一個訊號組有154個訊號
如果您增加訊號,則總值必須低於核心參數(semmax)定義的上限
安裝Oracle軟體時,預先安裝的檢查程式將檢查semmax的設定
之後,當系統達到穩定點時,您可以檢查實際的利用情況,然後相應調整核心值
針對Oracle使用者的用法
如何查看Oracle資料庫執行個體使用的共用記憶體段?
為此,請使用oradebug命令
sys@ORCL> oradebug setmypidStatement processed.sys@ORCL> oradebug ipcInformation written to trace file.sys@ORCL> oradebug TRACEFILE_NAME/u01/app/oracle/admin/orcl/udump/orcl_ora_7525.trc
現在開啟追蹤檔案,將會看到共用記憶體ID(5505041)
下面是該檔案的節選
Area #0 `Fixed Size' containing Subareas 0-0 Total size 0000000000129cb0 Minimum Subarea size 00000000 Area Subarea Shmid Stable Addr Actual Addr 0 0 5505041 0x00000020000000 0x00000020000000 Subarea size Segment size 000000000012a000 0000000019002000 Area #1 `Variable Size' containing Subareas 2-2 Total size 0000000018c00000 Minimum Subarea size 00400000 Area Subarea Shmid Stable Addr Actual Addr 1 2 5505041 0x00000020400000 0x00000020400000 Subarea size Segment size 0000000018c00000 0000000019002000 Area #2 `Redo Buffers' containing Subareas 1-1 Total size 00000000002d6000 Minimum Subarea size 00000000 Area Subarea Shmid Stable Addr Actual Addr 2 1 5505041 0x0000002012a000 0x0000002012a000 Subarea size Segment size 00000000002d6000 0000000019002000
可以使用共用記憶體ID來擷取共用記憶體的詳細資料
結合上面提到的ipcs -m -i 5505041
另一個有用的觀察是lpid的值----最後一個接觸共用記憶體段的進程的進程ID
要展示該屬性值,使用SQL*PLUS從另一個會話串連到該執行個體
[oracle@Think ~]$ sqlplus / as sysdbasys@ORCL> select spid from v$process where addr = (select paddr from v$session where sid = (select sid from v$mystat where rownum<2));SPID------------11439
現在,針對同一個共用記憶體段再次執行ipcs命令
[root@Think ~]# ipcs -m -i 5505041Shared memory Segment shmid=5505041uid=501 gid=502 cuid=501 cgid=502mode=0640 access_perms=0640bytes=419438592 lpid=11476 cpid=5300 nattch=20att_time=Sun Feb 3 21:25:31 2013 det_time=Sun Feb 3 21:25:31 2013 change_time=Sun Feb 3 09:08:06 2013
注意,lpid的值已經從原來的值10881更改為11476
lpid顯示最後一個接觸共用記憶體段的進程的PID
⑶ ipcrm
既然您已經標識了共用記憶體和其他IPC指標,那麼使用它們做什麼呢?
之前您看到過一些用法,如標識Oracle使用的共用記憶體,確保為共用記憶體設定了核心參數等等
另一個常見的應用是刪除共用記憶體,IPC訊息佇列或訊號組
要刪除某個共用記憶體段,注意ipcs命令輸出中它的shmid,然後使用-m選項刪除該段,要刪除ID為3735562段,使用:
[root@Think ~]# ipcrm -m 3735562ipcrm: already removed id (3735562)
這將刪除該共用記憶體,還可以使用該命令刪除訊號和IPC訊息佇列(使用-s和-q參數)
針對Oracle使用者的用法
有時當您關閉資料庫執行個體時,Linux核心可能未完全清除共用記憶體段
留下的共用記憶體沒有什麼用處,但是它會佔用系統資源,從而使可用於其他進程的記憶體更少
這種情況下,可以檢查oracle使用者所擁有的任何延遲共用記憶體段,然後刪除它們,如果有這樣的段,使用ipcrm刪之
⑷ vmstat
vmstat是最早用於顯示所有與記憶體和進程相關資訊的命令
調用時,該命令持續運行並發布其資訊
它有兩個參數:
vmstat <interval> <count>
<interval>是兩次運行之間的時間間隔,以秒為單位
<count>是vmstat重複的次數
下面是當我們希望vmstat每隔5秒運行一次並在第10次運行後停止時的例子
每5秒之後都會輸出一行並顯示此時的統計資訊
[root@Think ~]# vmstat 5 10procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 0 38576 76284 639688 0 0 25 24 98 186 1 1 97 1 0 0 0 0 38532 76292 639716 0 0 0 22 102 194 0 0 99 0 0 0 0 0 38516 76292 639720 0 0 0 13 99 187 0 0 99 0 0 0 0 0 38524 76300 639720 0 0 0 68 121 232 1 0 99 0 0 0 0 0 38524 76304 639720 0 0 0 16 165 298 1 1 99 0 0 0 0 0 38540 76308 639720 0 0 0 16 84 176 0 0 99 0 0 0 0 0 38524 76316 639840 0 0 0 81 94 187 0 0 99 0 0 1 0 0 38404 76324 639848 0 0 0 17 89 181 0 0 100 0 0 0 0 0 38404 76324 639848 0 0 0 13 93 180 0 0 99 0 0 2 0 0 38420 76328 639848 0 0 0 11 220 364 1 1 99 0 0
該輸出顯示有關係統資源的大量資訊,我們來詳細介紹他們:
有時,還存在另外一列,該列位於標題“w”下,顯示可以運行但已經交換到交換分區的進程數
"b"下的數值應該接近於0,如果"w"下的數值很高,可能需要運行更多的記憶體
下表顯示了記憶體指標:
緩衝區記憶體(buff)用來隱藏檔中繼資料(如i-nodes)以及原始塊裝置中的資料
緩衝記憶體(cache)用於檔案資料本身
下表顯示了交換活動
下表顯示了I/O活動
下表顯示了系統相關活動
最後這張表可能用得最多---有關CPU負載的資訊
讓我們看一下如何解釋這些值
輸出的第一行是自從系統重新啟動以來所有指標的平均值
因此,可忽略該行,因為它並不顯示目前狀態,其他行則顯示即時指標
理想情況下,等待或阻塞的進程數量(位於"procs"標題下)應該為0或接近於0
如果數值較高,則表示系統沒有足夠的資源(如CPU 記憶體或I/O)
診斷效能問題時,該資訊非常重要
"swap"下的資料表明交換是否過多,如果交換過多,則表明實體記憶體可能不足
應該減少記憶體需求或增加物理RAM
"io"下的資料表示往返於磁碟的資料流,這表明進行中的磁碟活動量,這並不一定表明存在問題
如果您看到"procs"的"b"(正在阻塞的進程)下有較大的數值和較高的I/O,則可能出現嚴重的I/O爭用問題
"cpu"標題下是最有用的資訊,"id"列顯示空閑CPU,如果用100減去該值,則會得到繁忙CPU的百分比
與top相比,top顯示每個CPU的空閑百分比,而vmstat顯示所有CPU的空閑百分比
vmstat命令還顯示CPU的使用方式的劃分:Linux系統使用多少,使用者進程使用多少以及等待I/O使用多少
通過該劃分,您可以確定CPU消耗的組成,如果系統CPU負載過高,能表明正在運行某個根進程嗎?
一段時間內的系統負載應該一致,如果系統顯示較高的值,請配合使用top命令確定佔有CPU的系統進程
針對Oracle使用者的用法
Oracle進程(後台進程和伺服器處理序)和使用者進程(sqlplus,apache等)位於"us"下
如果該數值較高,則使用top來確定進程;如果"wa"列顯示較高數值,則表明I/O系統無法跟上讀取或寫入的數量
有時這可能是因為在資料庫中進行大量的更新,從而導致switch log以及後續的大量歸檔進程
但是,如果他持續顯示一個較大的數值,則表明可能存在I/O瓶頸
Oracle資料庫中的I/O瓶頸可能會造成嚴重的問題,與效能問題不同,慢速I/O可能導致控制檔案寫入速度緩慢
這會導致等待擷取控制檔案的進程排入佇列,如果等待超過900秒且等待者是關鍵進程(如LGWR),則會關閉資料庫執行個體