針對Oracle使用者的Linux進階命令詳解之資源管理篇

來源:互聯網
上載者:User
          ⑴ 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),則會關閉資料庫執行個體

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.