sar這東西,一開始還以為是內部有的,原來是外部的工具,可以到http://pagesperso-orange.fr/sebastien.godard/download.html去下載

           

          1 安裝
             tar zxvf xxx.tar.gz

             ./configure

             make

             make install

           

          2 使用
          pidstat 2 5
          //每隔2秒,顯示5次,所有活動進程的CPU使用情況
          pidstat -p 3132 2 5
          //每隔2秒,顯示5次,PID為3132的進程的CPU使用情況顯示
          pidstat -p 3132 2 5 -r
          //每隔2秒,顯示5次,PID為3132的進程的內存使用情況顯示

            

             查看CPU使用情況

          sar 2 5
          //每隔2秒,顯示5次,CPU使用的情況

           

             %usr:CPU處在用戶模式下的時間百分比。
            %sys:CPU處在系統模式下的時間百分比。
            %wio:CPU等待輸入輸出完成時間的百分比。
            %idle:CPU空閑時間百分比。

          在所有的顯示中,我們應主要注意%wio和%idle,%wio的值過高,表示硬盤存在I/O瓶頸,
          %idle值高,表示CPU較空閑,如果%idle值高但系統響應慢時,有可能是CPU等待分配內存,
          此時應加大內存容量。%idle值如果持續低于10,那么系統的CPU處理能力相對較低,表
          明系統中最需要解決的資源是CPU。

              sar 1 10 > data.txt
          //每隔1秒,寫入10次,把CPU使用數據保存到data.txt文件中。
          sar 1 0 -e 15:00:00 > data.txt
          //每隔1秒記錄CPU的使用情況,直到15點,數據將保存到data.txt文件中。(-e 參數表示結束時間,注意時間格式:必須為hh:mm:ss格式)
          sar 1 0 -r -e 15:00:00 > data.txt
          //每隔1秒記錄內存使用情況,直到15點,數據將保存到data.txt文件中。
          sar 1 0 -n DEV -e 15:00:00 > data.txt
          //每隔1秒記錄網絡使用情況,直到15點,數據將保存到data.txt文件中。

           

              例二:使用命行sar -v t n

          例如,每30秒采樣一次,連續采樣5次,觀察核心表的狀態,需鍵入如下命令:

          # sar -v 30 5

          屏幕顯示:
                SCO_SV scosysv 3.2v5.0.5 i80386 10/01/2001
                10:33:23 proc-sz ov inod-sz ov file-sz ov lock-sz   (-v)
          10:33:53 305/ 321  0 1337/2764  0 1561/1706 0 40/ 128
          10:34:23 308/ 321  0 1340/2764  0 1587/1706 0 37/ 128
          10:34:53 305/ 321  0 1332/2764  0 1565/1706 0 36/ 128
          10:35:23 308/ 321  0 1338/2764  0 1592/1706 0 37/ 128
          10:35:53 308/ 321  0 1335/2764  0 1591/1706 0 37/ 128

          顯示內容包括:

          proc-sz:目前核心中正在使用或分配的進程表的表項數,由核心參數MAX-PROC控制。

            inod-sz:目前核心中正在使用或分配的i節點表的表項數,由核心參數
          MAX-INODE控制。

            file-sz: 目前核心中正在使用或分配的文件表的表項數,由核心參數MAX-FILE控
          制。

            ov:溢出出現的次數。

            Lock-sz:目前核心中正在使用或分配的記錄加鎖的表項數,由核心參數MAX-FLCKRE
          控制。

          顯示格式為

          實際使用表項/可以使用的表項數

          顯示內容表示,核心使用完全正常,三個表沒有出現溢出現象,核心參數不需調整,如
          果出現溢出時,要調整相應的核心參數,將對應的表項數加大。

          例三:使用命行sar -d t n

          例如,每30秒采樣一次,連續采樣5次,報告設備使用情況,需鍵入如下命令:

          # sar -d 30 5

          屏幕顯示:

                SCO_SV scosysv 3.2v5.0.5 i80386 10/01/2001
          11:06:43 device %busy   avque   r+w/s  blks/s  avwait avserv (-d)
          11:07:13 wd-0   1.47   2.75   4.67   14.73   5.50 3.14
          11:07:43 wd-0   0.43   18.77   3.07   8.66   25.11 1.41
          11:08:13 wd-0   0.77   2.78   2.77   7.26   4.94 2.77
          11:08:43 wd-0   1.10   11.18   4.10   11.26   27.32 2.68
          11:09:13 wd-0   1.97   21.78   5.86   34.06   69.66 3.35
          Average wd-0   1.15   12.11   4.09   15.19   31.12 2.80

          顯示內容包括:

          device: sar命令正在監視的塊設備的名字。
            %busy: 設備忙時,傳送請求所占時間的百分比。
            avque: 隊列站滿時,未完成請求數量的平均值。
            r+w/s: 每秒傳送到設備或從設備傳出的數據量。
            blks/s: 每秒傳送的塊數,每塊512字節。
            avwait: 隊列占滿時傳送請求等待隊列空閑的平均時間。
            avserv: 完成傳送請求所需平均時間(毫秒)。

          在顯示的內容中,wd-0是硬盤的名字,%busy的值比較小,說明用于處理傳送請求的有
          效時間太少,文件系統效率不高,一般來講,%busy值高些,avque值低些,文件系統
          的效率比較高,如果%busy和avque值相對比較高,說明硬盤傳輸速度太慢,需調整。

          例四:使用命行sar -b t n

          例如,每30秒采樣一次,連續采樣5次,報告緩沖區的使用情況,需鍵入如下命令:

          # sar -b 30 5

          屏幕顯示:

            SCO_SV scosysv 3.2v5.0.5 i80386 10/01/2001
          14:54:59 bread/s lread/s %rcache bwrit/s lwrit/s %wcache pread/s pwrit/s (-b)
          14:55:29 0  147  100  5  21  78   0   0
          14:55:59 0  186  100  5  25  79   0   0
          14:56:29 4  232   98  8  58  86   0   0
          14:56:59 0  125  100  5  23  76   0   0
          14:57:29 0   89  100  4  12  66   0   0
          Average  1  156   99  5  28  80   0   0

          顯示內容包括:

          bread/s: 每秒從硬盤讀入系統緩沖區buffer的物理塊數。
          lread/s: 平均每秒從系統buffer讀出的邏輯塊數。
          %rcache: 在buffer cache中進行邏輯讀的百分比。
          bwrit/s: 平均每秒從系統buffer向磁盤所寫的物理塊數。
          lwrit/s: 平均每秒寫到系統buffer邏輯塊數。
          %wcache: 在buffer cache中進行邏輯讀的百分比。
          pread/s: 平均每秒請求物理讀的次數。
          pwrit/s: 平均每秒請求物理寫的次數。

          在顯示的內容中,最重要的是%cache和%wcache兩列,它們的值體現著buffer的使用效
          率,%rcache的值小于90或者%wcache的值低于65,應適當增加系統buffer的數量,buffer
          數量由核心參數NBUF控制,使%rcache達到90左右,%wcache達到80左右。但buffer參數
          值的多少影響I/O效率,增加buffer,應在較大內存的情況下,否則系統效率反而得不到
          提高。

          例五:使用命行sar -g t n

          例如,每30秒采樣一次,連續采樣5次,報告串口I/O的操作情況,需鍵入如下命令:

          # sar -g 30 5

          屏幕顯示:

          SCO_SV scosysv 3.2v5.0.5 i80386  11/22/2001
          17:07:03  ovsiohw/s  ovsiodma/s  ovclist/s (-g)
          17:07:33   0.00   0.00   0.00
          17:08:03   0.00   0.00   0.00
          17:08:33   0.00   0.00   0.00
          17:09:03   0.00   0.00   0.00
          17:09:33   0.00   0.00   0.00
          Average    0.00   0.00   0.00

          顯示內容包括:

          ovsiohw/s:每秒在串口I/O硬件出現的溢出。

          ovsiodma/s:每秒在串口I/O的直接輸入輸出通道高速緩存出現的溢出。

          ovclist/s :每秒字符隊列出現的溢出。

          在顯示的內容中,每一列的值都是零,表明在采樣時間內,系統中沒有發生串口I/O溢
          出現象。

          0
          0
          posted @ 2010-06-03 15:12 小馬歌 閱讀(2048) | 評論 (0)編輯 收藏
           
          sysstat

          使用yum安裝
          #yum install sysstat

          sysstat的安裝包是:sysstat-5.0.5-1.i386.rpm,裝完了sysstat-5.0.5-1.i386.rpm
          后 就會有iostat、mpstat、sar、sa的功能,sysstat-5.0.5-1.i386.rpm

          啟動sysstat
          /etc/init.d/sysstat start

          設置sysstat自啟動
          #checkfig sysstat on

          MPSTAT

          MPSTAT -P ALL 2 3

           

          mpstat是Multiprocessor Statistics的縮寫,是實時系統監控工具。其報告與CPU的一些統計信息,這些信息存放在/proc/stat文件中。在多CPUs系統里,其不 但能查看所有CPU的平均狀況信息,而且能夠查看特定CPU的信息。下面只介紹 mpstat與CPU相關的參數,mpstat的語法如下:

          mpstat [-P {|ALL}] [internal [count]]

          參數的含義如下:

          參數 解釋

          -P {|ALL} 表示監控哪個CPU, cpu在[0,cpu個數-1]中取值

          internal 相鄰的兩次采樣的間隔時間

          count 采樣的次數,count只能和delay一起使用

          當沒有參數時,mpstat則顯示系統啟動以后所有信息的平均值。有interval時,第 一行的信息自系統啟動以來的平均信息。從第二行開始,輸出為前一個interval時間段的平均信息。與CPU有關的輸出的含義如下:

          參數 解釋 從/proc/stat獲得數據

          CPU 處理器ID

          user 在internal時間段里,用戶態的CPU時間(%) ,不包含 nice值為負 進程 ?usr/?total*100

          nice 在internal時間段里,nice值為負進程的CPU時間(%) ?nice/?total*100

          system 在internal時間段里,核心時間(%) ?system/?total*100

          iowait 在internal時間段里,硬盤IO等待時間(%) ?iowait/?total*100

          irq 在internal時間段里,軟中斷時間(%) ?irq/?total*100

          soft 在internal時間段里,軟中斷時間(%) ?softirq/?total*100

          idle 在internal時間段里,CPU除去等待磁盤IO操作外的因為任何原因而空閑的時間閑置時間 (%) ?idle/?total*100

          intr/s 在internal時間段里,每秒CPU接收的中斷的次數 ?intr/?total*100

          CPU總的工作時 間=total_cur=user+system+nice+idle+iowait+irq+softirq

          total_pre=pre_user+ pre_system+ pre_nice+ pre_idle+ pre_iowait+ pre_irq+ pre_softirq

          ?user=user_cur – user_pre

          ?total=total_cur-total_pre

          其中_cur 表示當前值,_pre表示interval時間前的值。上表中的所有值可取到兩位小數點。

          cat /proc/stat

          “ctxt”給出了自系統啟動以來CPU發生的上下文交換的次數。

          “btime”給出了從系統啟動到現在為止的時間,單位為秒。

          “processes (total_forks) 自系統啟動以來所創建的任務的個數目。

          “procs_running”:當前運行隊列的任務的數目。

          “procs_blocked”:當前被阻塞的任務的數目。

          ============================

          sysstat工具包提供的主要命令:iostat mpstat sar

          sar的最后兩個參數一般是interval count

          1、sar -u 1 5
          輸出CPU使用情況的統計信息,每秒輸出一次,一共輸出100次
          17時06分01秒       CPU     %user     %nice   %system   %iowait     %idle
          17時06分02秒       all      1.27      0.00      0.51      1.01     97.22
          17時06分03秒       all      0.00      0.00      0.00      0.00    100.00
          17時06分04秒       all      0.00      0.00      0.00      0.00    100.00
          17時06分05秒       all      0.25      0.00      0.00      0.00     99.75
          17時06分06秒       all      0.00      0.00      0.00      0.51     99.49
          Average:          all      0.30      0.00      0.10      0.30     99.29

          CPU      all 表示統計信息為所有 CPU 的平均值。                                       
          %user    顯示在用戶級別(application)運行使用 CPU 總時間的百分比。                  
          %nice    顯示在用戶級別,用于nice操作,所占用 CPU 總時間的百分比。            
          %system 在核心級別(kernel)運行所使用 CPU 總時間的百分比。      
          %iowait 顯示用于等待I/O操作占用 CPU 總時間的百分比。
          %steal   管理程序(hypervisor)為另一個虛擬進程提供服務而等待虛擬 CPU 的百分比。
          %idle    顯示 CPU 空閑時間占用 CPU 總時間的百分比。

          tips:
          若 %iowait 的值過高,表示硬盤存在I/O瓶頸
          若 %idle 的值高但系統響應慢時,有可能是 CPU 等待分配內存,此時應加大內存容量
          若 %idle 的值持續低于 10,則系統的 CPU 處理能力相對較低,表明系統中最需要解決的資源是 CPU。

          2、sar -b 1 5
          顯示I/O和傳送速率的統計信息
          17時09分07秒       tps      rtps      wtps   bread/s   bwrtn/s
          17時09分08秒      3.12      3.12      0.00     25.00      0.00
          17時09分09秒     89.58      6.25     83.33    141.67    733.33
          17時09分10秒     42.71      9.38     33.33    141.67    600.00
          17時09分11秒      2.11      2.11      0.00     16.84      0.00
          17時09分12秒      1.04      0.00      1.04      0.00    175.00
          Average:        27.77      4.18     23.59     65.14    302.30

          tps     每秒鐘物理設備的 I/O 傳輸總量                   
          rtps    每秒鐘從物理設備讀入的數據總量                 
          wtps    每秒鐘向物理設備寫入的數據總量                 
          bread/s 每秒鐘從物理設備讀入的數據量,單位為 塊/s   
          bwrtn/s 每秒鐘向物理設備寫入的數據量,單位為 塊/s   

          3、sar -c
          每秒鐘創建的進程數
          15時10分01秒      1.35
          15時20分01秒      1.01
          15時30分01秒      0.59
          15時40分01秒      1.35
          15時50分01秒      0.99
          16時00分01秒      0.57
          16時10分01秒      1.33
          16時20分01秒      1.02
          16時30分01秒      0.57
          16時40分01秒      1.33
          16時50分01秒      1.07
          17時00分01秒      0.56
          17時10分01秒      1.32

          4、sar -n DEV 1 5
          輸出網絡設備狀態的統計信息
          17時13分42秒     IFACE   rxpck/s   txpck/s   rxbyt/s   txbyt/s   rxcmp/s   txcmp/s rxmcst/s
          17時13分43秒      eth1   3669.70   4156.57 368362.63 2747714.14      0.00      0.00      0.00
          17時13分44秒      eth1   2689.11   2585.15 289661.39 701461.39      0.00      0.00      0.00
          17時13分45秒      eth1   3746.00   4077.00 415178.00 2605720.00      0.00      0.00      0.00
          17時13分46秒      eth1   3096.00   3241.00 327916.00 1597320.00      0.00      0.00      0.00
          17時13分47秒      eth1   2910.00   2834.00 312632.00 957903.00      0.00      0.00      0.00
          Average:         eth1   3220.20   3375.60 342592.60 1717931.20      0.00      0.00      0.00

          IFACE      網絡設備名                          
          rxpck/s    每秒接收的包總數                 
          txpck/s    每秒傳輸的包總數                  
          rxbyt/s    每秒接收的字節(byte)總數        
          txbyt/s    每秒傳輸的字節(byte)總數        
          rxcmp/s    每秒接收壓縮包的總數              
          txcmp/s    每秒傳輸壓縮包的總數              
          rxmcst/s   每秒接收的多播(multicast)包的總數

          5、sar -q 1 5
          輸出進程隊列長度和平均負載狀態統計信息
          17時16分28秒   runq-sz plist-sz   ldavg-1   ldavg-5 ldavg-15
          17時16分29秒         0       160      0.26      0.11      0.03
          17時16分30秒         0       160      0.26      0.11      0.03
          17時16分31秒         0       160      0.24      0.11      0.03
          17時16分32秒         0       160      0.24      0.11      0.03
          17時16分33秒         0       160      0.24      0.11      0.03
          Average:            0       160      0.25      0.11      0.03

          runq-sz   運行隊列的長度(等待運行的進程數)                                     
          plist-sz 進程列表中進程(processes)和線程(threads)的數量                    
          ldavg-1   最后1分鐘的系統平均負載(System load average)                         
          ldavg-5   過去5分鐘的系統平均負載                                                
          ldavg-15 過去15分鐘的系統平均負載                                              

          6、sar -r
          輸出內存和交換空間的統計信息
          7、iostat
          tps 每秒鐘物理設備的 I/O 傳輸總 量。                                                                                          
          Blk_read 讀入的數據總量,單位為 塊。                                                                                          
          Blk_wrtn 寫入的數據總量,單位為 塊。                                                                                          
          kB_read 讀入的數據總量,單位為 KB。                                                                                           
          kB_wrtn 寫入的數據總量,單位為 KB。                                                                                           
          MB_read 讀入的數據總量,單位為 MB。                                                                                           
          MB_wrtn 寫入的數據總量,單位為 MB。                                                                                           
          Blk_read/s 每秒從驅動器讀入的數據量,單位為 塊 /s。                                                                           
          Blk_wrtn/s 每秒向驅動器寫入的數據量,單位為 塊 /s。                                                                           
          kB_read/s 每秒從驅動器讀入的數據量,單位為 KB/s。                                                                             
          kB_wrtn/s 每秒向驅動器寫入的數據量,單位為 KB/s。                                                                             
          MB_read/s 每秒從驅動器讀入的數據量,單位為 MB/s。                                                                             
          MB_wrtn/s 每秒向驅動器寫入的數據量,單位為MB/s。
          rrqm/s 將讀入請求合并后,每秒發送到設備的讀入請求數。   
          wrqm/s 將寫入請求合并后,每秒發送到設備的寫入請求數。
          r/s 每秒發送到設備的讀入請求 數。                                                                                             
          w/s 每秒發送到設備的寫入請求 數。                                                                                             
          rsec/s 每秒從設備讀入的扇區 數。                                                                                              
          wsec/s 每秒向設備寫入的扇區 數。                                                                                              
          rkB/s 每秒從設備讀入的數據量,單位為 KB/s。                                                                                  
          wkB/s 每秒向設備寫入的數據量,單位為 KB/s。                                                                                  
          rMB/s 每秒從設備讀入的數據量,單位為 MB/s。                                                                                  
          wMB/s 每秒向設備寫入的數據量,單位為 MB/s。                                                                                  
          avgrq-sz 發送到設備的請求的平均大小,單位為扇 區。                                                                            
          avgqu-sz 發送到設備的請求的平均隊列長 度。                                                                                    
          await I/O請求平均執行時間。包括發送請求和執行的時間。單位為毫 秒。                                                   
          svctm 發送到設備的I/O請求的平均執行時間。單位為毫 秒。                                                                      
          %util 在I/O請求發送到設備期間,占用CPU時間的百分比。用于顯示設備的帶寬利用率。當這個值接近100%時,表示設備帶寬已經占滿。

          posted @ 2010-06-03 15:12 小馬歌 閱讀(946) | 評論 (0)編輯 收藏
           
          我們知道判斷一個系統的負載可以使用top,uptime等命令去查看,它分別記錄了一分鐘、五分鐘、以及十五分鐘的系統平均負載

          例如我的某臺服務器:

          $ uptime

          09:50:21 up 200 days, 15:07, 1 user, load average: 0.27, 0.33, 0.37

          大部分的人都認為這個數字越小越好,其實有很多關聯的提示信息,今天看到這個好文,應該可以給大家說清楚很多問題,轉一下:

          原文鏈接: http://blog.scoutapp.com/articles/2009/07/31/understanding-load-averages

          你可能對于 Linux 的負載均值(load averages)已有了充分的了解。負載均值在 uptime 或者 top 命令中可以看到,它們可能會顯示成這個樣子:

          load average: 0.09, 0.05, 0.01

          很多人會這樣理解負載均值:三個數分別代表不同時間段的系統平均負載(一分鐘、五 分鐘、以及十五分鐘),它們的數字當然是越小越好。數字越高,說明服務器的負載越 大,這也可能是服務器出現某種問題的信號。

          而事實不完全如此,是什么因素構成了負載均值的大小,以及如何區分它們目前的狀況是 “好”還是“糟糕”?什么時候應該注意哪些不正常的數值?

          回答這些問題之前,首先需要了解下這些數值背后的些知識。我們先用最簡單的例子說明, 一臺只配備一塊單核處理器的服務器。

          行車過橋

          一只單核的處理器可以形象得比喻成一條單車道。設想下,你現在需要收取這條道路的過橋 費 — 忙于處理那些將要過橋的車輛。你首先當然需要了解些信息,例如車輛的載重、以及還有多少車輛正在等待過橋。如果前面沒有車輛在等待,那么你可以告訴后面的司機通過。 如果車輛眾多,那么需要告知他們可能需要稍等一會。

          因此,需要些特定的代號表示目前的車流情況,例如:

          0.00 表示目前橋面上沒有任何的車流。 實際上這種情況與 0.00 和 1.00 之間是相同的,總而言之很通暢,過往的車輛可以絲毫不用等待的通過。

          1.00 表示剛好是在這座橋的承受范圍內。 這種情況不算糟糕,只是車流會有些堵,不過這種情況可能會造成交通越來越慢。

          超過 1.00,那么說明這座橋已經超出負荷,交通嚴重的擁堵。 那么情況有多糟糕? 例如 2.00 的情況說明車流已經超出了橋所能承受的一倍,那么將有多余過橋一倍的車輛正在焦急的等待。3.00 的話情況就更不妙了,說明這座橋基本上已經快承受不了,還有超出橋負載兩倍多的車輛正在等待。

          上面的情況和處理器的負載情況非常相似。一輛汽車的過橋時間就好比是處理器處理某線程 的實際時間。Unix 系統定義的進程運行時長為所有處理器內核的處理時間加上線程 在隊列中等待的時間。

          和收過橋費的管理員一樣,你當然希望你的汽車(操作)不會被焦急的等待。所以,理想狀態 下,都希望負載平均值小于 1.00 。當然不排除部分峰值會超過 1.00,但長此以往保持這 個狀態,就說明會有問題,這時候你應該會很焦急。

          “所以你說的理想負荷為 1.00 ?”

          嗯,這種情況其實并不完全正確。負荷 1.00 說明系統已經沒有剩余的資源了。在實際情況中 ,有經驗的系統管理員都會將這條線劃在 0.70:

          “需要進行調查法則”: 如果長期你的系統負載在 0.70 上下,那么你需要在事情變得更糟糕之前,花些時間了解其原因。

          “現在就要修復法則”:1.00 。 如果你的服務器系統負載長期徘徊于 1.00,那么就應該馬上解決這個問題。否則,你將半夜接到你上司的電話,這可不是件令人愉快的事情。

          “凌晨三點半鍛煉身體法則”:5.00。 如果你的服務器負載超過了 5.00 這個數字,那么你將失去你的睡眠,還得在會議中說明這情況發生的原因,總之千萬不要讓它發生。

          那么多個處理器呢?我的均值是 3.00,但是系統運行正常!

          哇喔,你有四個處理器的主機?那么它的負載均值在 3.00 是很正常的。

          在多處理器系統中,負載均值是基于內核的數量決定的。以 100% 負載計算,1.00 表示單個處理器,而 2.00 則說明有兩個雙處理器,那么 4.00 就說明主機具有四個處理器。

          回到我們上面有關車輛過橋的比喻。1.00 我說過是“一條單車道的道路”。那么在單車道 1.00 情況中,說明這橋梁已經被車塞滿了。而在雙處理器系統中,這意味著多出了一倍的 負載,也就是說還有 50% 的剩余系統資源 — 因為還有另外條車道可以通行。

          所以,單處理器已經在負載的情況下,雙處理器的負載滿額的情況是 2.00,它還有一倍的資源可以利用。

          [NextPage]

          多核與多處理器

          先脫離下主題,我們來討論下多核心處理器與多處理器的區別。從性能的角度上理解,一臺主 機擁有多核心的處理器與另臺擁有同樣數目的處理性能基本上可以認為是相差無幾。當然實際 情況會復雜得多,不同數量的緩存、處理器的頻率等因素都可能造成性能的差異。

          但即便這些因素造成的實際性能稍有不同,其實系統還是以處理器的核心數量計算負載均值 。這使我們有了兩個新的法則:

          “有多少核心即為有多少負荷”法則: 在多核處理中,你的系統均值不應該高于處理器核心的總數量。

          “核心的核心”法則: 核心分布在分別幾個單個物理處理中并不重要,其實兩顆四核的處理器 等于 四個雙核處理器 等于 八個單處理器。所以,它應該有八個處理器內核。

          審視我們自己

          讓我們再來看看 uptime 的輸出

          ~ $ uptime

          23:05 up 14 days, 6:08, 7 users, load averages: 0.65 0.42 0.36

          這是個雙核處理器,從結果也說明有很多的空閑資源。實際情況是即便它的峰值會到 1.7,我也從來沒有考慮過它的負載問題。

          那么,怎么會有三個數字的確讓人困擾。我們知道,0.65、0.42、0.36 分別說明上一分鐘、最后五分鐘以及最后十五分鐘的系統負載均值。那么這又帶來了一個問題:

          我們以哪個數字為準?一分鐘?五分鐘?還是十五分鐘?

          其實對于這些數字我們已經談論了很多,我認為你應該著眼于五分鐘或者十五分鐘的平均數 值。坦白講,如果前一分鐘的負載情況是 1.00,那么仍可以說明認定服務器情況還是正常的。 但是如果十五分鐘的數值仍然保持在 1.00,那么就值得注意了(根據我的經驗,這時候你應該增加的處理器數量了)。

          那么我如何得知我的系統裝備了多少核心的處理器?

          在 Linux 下,可以使用

          cat /proc/cpuinfo

          獲取你系統上的每個處理器的信息。如果你只想得到數字,那么就使用下面的命令:

          grep 'model name' /proc/cpuinfo | wc -l

          Popularity: 11% [?]

           原文地址 http://os.51cto.com/art/200911/164410.htm
          posted @ 2010-04-20 14:31 小馬歌 閱讀(156) | 評論 (0)編輯 收藏
           

          top 1.作用
          top命令用來顯示執行中的程序進程,使用權限是所有用戶。

          2.格式
          top [-] [d delay] [q] [c] [S] [s] [i] [n]

          3.主要參數
          d:指定更新的間隔,以秒計算。
          q:沒有任何延遲的更新。如果使用者有超級用戶,則top命令將會以最高的優先序執行。
          c:顯示進程完整的路徑與名稱。
          S:累積模式,會將己完成或消失的子行程的CPU時間累積起來。
          s:安全模式。
          i:不顯示任何閑置(Idle)或無用(Zombie)的行程。
          n:顯示更新的次數,完成后將會退出top。

           

          如何查看Linux下系統占用的資源(top、free、uptime)[多圖]圖片1

          點擊查看大圖

           

          圖1 top命令的顯示

          在圖1中,第一行表示的項目依次為當前時間、系統啟動時間、當前系統登錄用戶數目、平均負載。第二行顯示的是所有啟動的進程、目前運行的、掛起(Sleeping)的和無用(Zombie)的進程。第三行顯示的是目前CPU的使用情況,包括系統占用的比例、用戶使用比例、閑置(Idle)比例。第四行顯示物理內存的使用情況,包括總的可以使用的內存、已用內存、空閑內存、緩沖區占用的內存。第五行顯示交換分區使用情況,包括總的交換分區、使用的、空閑的和用于高速緩存的大小。第六行顯示的項目最多,下面列出了詳細解釋。
          PID(Process ID):進程標示號。
          USER:進程所有者的用戶名。
          PR:進程的優先級別。
          NI:進程的優先級別數值。
          VIRT:進程占用的虛擬內存值。
          RES:進程占用的物理內存值。
          SHR:進程使用的共享內存值。
          S:進程的狀態,其中S表示休眠,R表示正在運行,Z表示僵死狀態,N表示該進程優先值是負數。
          %CPU:該進程占用的CPU使用率。
          %MEM:該進程占用的物理內存和總內存的百分比。
          TIME+:該進程啟動后占用的總的CPU時間。
          Command:進程啟動的啟動命令名稱,如果這一行顯示不下,進程會有一個完整的命令行。
          top命令使用過程中,還可以使用一些交互的命令來完成其它參數的功能。這些命令是通過快捷鍵啟動的。
          <空格>:立刻刷新。

          P:根據CPU使用大小進行排序。
          T:根據時間、累計時間排序。
          q:退出top命令。
          m:切換顯示內存信息。
          t:切換顯示進程和CPU狀態信息。
          c:切換顯示命令名稱和完整命令行。
          M:根據使用內存大小進行排序。
          W:將當前設置寫入~/.toprc文件中。這是寫top配置文件的推薦方法。

          可以看到,top命令是一個功能十分強大的監控系統的工具,對于系統管理員而言尤其重要。但是,它的缺點是會消耗很多系統資源。

          更多的請看:http://www.qqread.com/windows/2003/index.html

          free

          1.作用
          free命令用來顯示內存的使用情況,使用權限是所有用戶。

          2.格式
          free [-b-k-m] [-o] [-s delay] [-t] [-V]

          3.主要參數
          -b -k -m:分別以字節(KB、MB)為單位顯示內存使用情況。
          -s delay:顯示每隔多少秒數來顯示一次內存使用情況。
          -t:顯示內存總和列。
          -o:不顯示緩沖區調節列。

          4.應用實例
          free命令是用來查看內存使用情況的主要命令。和top命令相比,它的優點是使用簡單,并且只占用很少的系統資源。通過-S參數可以使用free命令不間斷地監視有多少內存在使用,這樣可以把它當作一個方便實時監控器。
          #free -b -s5

          使用這個命令后終端會連續不斷地報告內存使用情況(以字節為單位),每5秒更新一次。

          如何查看Linux下系統占用的資源(top、free、uptime)[多圖]圖片2

          點擊查看大圖

           

          更多的請看:http://www.qqread.com/windows/2003/index.html

          uptime 命令

          我曾經看到資料上講,load avarage <3 系統良好,大于5 則有嚴重的性能問題。注意,這個值還應當除以CPU數目。

          如果load avarage=8 ,CPU=3,8/3=2.666,2.66這個值表示系統狀態良好

          于5也不一定是嚴重性能問題,有可能是的確主機提供的服務超過了他能夠提供的能力,需要擴容了。要具體看看。

           

          如何查看Linux下系統占用的資源(top、free、uptime)[多圖]圖片2

          點擊查看大圖

           

          下次我們來說 vmstat 與 iostat 這兩個很有用的命令。

          posted @ 2010-04-20 14:29 小馬歌 閱讀(960) | 評論 (0)編輯 收藏
           

          一直想找一些關于PHP加速的文章,偶然看到殺客的這篇文章,感覺不錯,分享給大家,再此感謝殺客。

          一、PHP加速器介紹

                  PHP加速器是一個為了提高PHP執行效率,從而緩存起PHP的操作碼,這樣PHP后面執行就不用解析轉換了,可以直接調用PHP操作碼,這樣速度上就提高了不少。

                  Apache中使用mod_php的請求、響應執行流程:

            1、Apache接收請求。
          2、Apache傳遞請求給mod_php。
          3、mod_php定位磁盤文件,并加載到內存中。
          4、mod_php編譯源代碼成為opcode樹。
          5、mod_php執行opcode樹。

                 PHP加速器相應的就是第四步,它的目的就是防止PHP每次請求都重復編譯PHP代碼,因為在高訪問量的網站上,大量的編譯往往沒有執行速度快呢?所以這里面有個瓶頸就是PHP的重復編譯既影響了速度又加載了服務器負載,為了解決此問題,PHP加速器就這樣誕生了。

          二、PHP加速器安裝與配置

                  1、安裝配置APC

                       APC全稱是Alternative PHP Cache,官方翻譯叫”可選PHP緩存”,它是PHP PECL中的一個擴展,好像是facebook在使用它,下面開始安裝(ubuntu環境): 
          $wget http://pecl.php.net/get/APC-3.0.19.tgz
          $tar xvzf APC-3.0.19.tgz
          $cd APC-3.0.19/APC-3.0.19
          $/usr/local/php/bin/phpize
          $./configure –enable-apc –enable-apc-mmap –with-php-config=/usr/local/php/bin/php-config
          $make
          $sudo make install

          下面我們再配置APC,因為我的PECL擴展路徑改變了,所以我得移動下編譯好的文件:
          $sudo mv /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/apc.so /usr/local/php/lib/php/extensions/PECL

          然后我們再編輯php.ini文件進行配置,請把下面的代碼加入到php.ini中即可:
          extension_dir = "/usr/local/php/lib/php/extensions/PECL"
          extension = apc.so
          ; APC
          apc.enabled = 1
          apc.shm_segments = 1
          apc.shm_size = 64
          apc.optimization = 1
          apc.num_files_hint = 0
          apc.ttl = 0
          apc.gc_ttl = 3600
          apc.cache_by_default = on

               這樣重啟apache就會在phpinfo()信息中顯示。

                 2、安裝配置eAccelerator

                    eAccelerator的前身其實是truck-mmcache,因為開發truk-mmcache的人被Zend給招安了,所以開發eAccelerator的人繼承了truk-mmcache的一些特性,設計出eAccelerator加速器。安裝如下:
          $wget http://jaist.dl.sourceforge.net/sourceforge/eaccelerator/eaccelerator-0.9.5.tar.bz2
          $tar -jxf eaccelerator-0.9.5.tar.bz2
          $cd eaccelerator-0.9.5
          $/usr/local/php/bin/phpize
          $./configure –enable-eaccelerator=shared –with-php-config=/usr/local/php/bin/php-config
          $make
          $sudo make install
          $sudo mv /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so /usr/local/php/lib/php/extensions/PECL

          將下面代碼加入php.ini文件中
          extension = eaccelerator.so
          ; eAccelerator
          eaccelerator.shm_size = "16"
          eaccelerator.cache_dir = "/tmp/eaccelerator"
          eaccelerator.enable = "1"
          eaccelerator.optimizer = "1"
          eaccelerator.check_mtime = "1"
          eaccelerator.debug = "0"
          eaccelerator.filter = ""
          eaccelerator.shm_max = "0"
          eaccelerator.shm_ttl = "0"
          eaccelerator.prune_period = "0"
          eaccelerator.shm_only = "0"
          eaccelerator.compress = "1"
          eaccelerator.compress_level = "9"

          創建緩存目錄,重啟apache

          $sudo mkdir /tmp/eaccelerator
          $sudo chmod 777 /tmp/eaccelerator
          $sudo /usr/local/apache/apachectl restart

          在phpinfo()檢查是否安裝成功.

          3、安裝配置XCache

          XCache作為國人自己開發的東西,做小菜鳥的我也感到驕傲,而且XCache無論在速度還是性能上都做的不錯。下面就趕緊讓我們品嘗它吧!

          $wget http://xcache.lighttpd.net/pub/Releases/1.2.2/xcache-1.2.2.tar.gz
          $tar xvzf xcache-1.2.2.tar.gz
          $cd xcache-1.2.2
          $/usr/local/php/bin/phpize
          $./configure –enable-xcache –enable-xcache-coverager –with-php-config=/usr/local/php/php-config
          $make
          $sudo make install
          $sudo mv /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/xcache.so /usr/local/php/lib/php/extensions/PECL

          在php.ini添加配置信息:

          extension = xcache.so
          ; xcache
          xcache.admin.user = "admin"
          xcache.admin.pass = "(執行) echo ’(你的密碼)’|md5sum(得出的密文)"
          ;
          xcache.size = 24M
          xcache.shm_scheme = "mmap"
          xcache.count = 2
          xcache.slots = 8k
          xcache.ttl = 0
          xcache.gc_interval = 0

          xcache.var_size = 8M
          xcache.var_count = 1
          xcache.var_slots = 8k
          xcache.var_ttl = 0
          xcache.var_maxttl = 0
          xcache.var_gc_interval = 300
          xcache.test = Off
          xcache.readonly_protection = On
          xcache.mmap_path = "/tmp/xcache"
          xcache.coredump_directory = ""
          xcache.cacher = On
          xcache.stat = On
          xcache.optimizer = Off
          ;
          xcache.coverager = On
          xcache.coveragedump_directory = ""

          創建緩存目錄,重啟apache

          $sudo mkdir /tmp/xcache
          $sudo chmod 777 /tmp/xcache
          $sudo /usr/local/apache/bin/apachectl restart

          去查看phpinfo()信息吧!

          三、PHP加速器測試

          1、測試環境

          硬件: AMD Athlon 64 X2 Dual Core Processor 4400+ @ 2.2GHz CPU, 2GB 內存. 160GB SATA 硬盤

          軟件: Linux Ubuntu server Gutsy 7.10, Apache 2.2.4, MySQL 5.0.45 和 PHP 5.2.3

          測試指令: ab -c5 -n3000 http://example.com/ (我們使用的是Apache Benchmark (ab) 工具,并發連接為5,3000次請求)

          2、測試結果

          無任何加速器:

          Document Path: /
          Document Length: 21757 bytes
          Concurrency Level: 5
          Time taken for tests: 288.255212 seconds
          Complete requests: 3000
          Failed requests: 0
          Write errors: 0
          Total transferred: 66777000 bytes
          HTML transferred: 65271000 bytes
          Requests per second: 10.41 [#/sec] (mean)
          Time per request: 480.425 [ms] (mean)
          Time per request: 96.085 [ms] (mean, across all concurrent requests)
          Transfer rate: 226.23 [Kbytes/sec] received
          Connection Times (ms)
          min mean[+/-sd] median max
          Connect: 0 0 0.5 0 19
          Processing: 181 479 186.0 444 1822
          Waiting: 166 461 184.7 427 1708
          Total: 181 479 186.0 444 1822
          Percentage of the requests served within a certain time (ms)
          50% 444
          66% 525
          75% 577
          80% 619
          90% 732
          95% 819
          98% 946
          99% 1012
          100% 1822 (longest request)

          APC加速器:

          Document Path: /
          Document Length: 21757 bytes
          Concurrency Level: 5
          Time taken for tests: 98.530068 seconds
          Complete requests: 3000
          Failed requests: 0
          Write errors: 0
          Total transferred: 66777000 bytes
          HTML transferred: 65271000 bytes
          Requests per second: 30.45 [#/sec] (mean)
          Time per request: 164.217 [ms] (mean)
          Time per request: 32.843 [ms] (mean, across all concurrent requests)
          Transfer rate: 661.84 [Kbytes/sec] received
          Connection Times (ms)
          min mean[+/-sd] median max
          Connect: 0 0 0.0 0 2
          Processing: 58 163 71.2 155 2452
          Waiting: 53 158 69.6 150 2329
          Total: 58 163 71.2 155 2452
          Percentage of the requests served within a certain time (ms)
          50% 155
          66% 178
          75% 193
          80% 204
          90% 235
          95% 258
          98% 285
          99% 302
          100% 2452 (longest request)

          eAccelerator加速器:

          Document Path: /
          Document Length: 21757 bytes
          Concurrency Level: 5
          Time taken for tests: 95.983986 seconds
          Complete requests: 3000
          Failed requests: 0
          Write errors: 0
          Total transferred: 66777000 bytes
          HTML transferred: 65271000 bytes
          Requests per second: 31.26 [#/sec] (mean)
          Time per request: 159.973 [ms] (mean)
          Time per request: 31.995 [ms] (mean, across all concurrent requests)
          Transfer rate: 679.39 [Kbytes/sec] received
          Connection Times (ms)
          min mean[+/-sd] median max
          Connect: 0 0 0.1 0 3
          Processing: 57 159 91.3 148 3830
          Waiting: 50 152 89.8 142 3704
          Total: 57 159 91.3 148 3830
          Percentage of the requests served within a certain time (ms)
          50% 148
          66% 174
          75% 193
          80% 205
          90% 239
          95% 263
          98% 289
          99% 309
          100% 3830 (longest request)

          XCache加速器:

          Document Path: /
          Document Length: 21757 bytes
          Concurrency Level: 5
          Time taken for tests: 99.76300 seconds
          Complete requests: 3000
          Failed requests: 0
          Write errors: 0
          Total transferred: 66777000 bytes
          HTML transferred: 65271000 bytes
          Requests per second: 30.28 [#/sec] (mean)
          Time per request: 165.127 [ms] (mean)
          Time per request: 33.025 [ms] (mean, across all concurrent requests)
          Transfer rate: 658.19 [Kbytes/sec] received
          Connection Times (ms)
          min mean[+/-sd] median max
          Connect: 0 0 0.0 0 2
          Processing: 59 164 83.4 155 3367
          Waiting: 52 156 66.4 148 1802
          Total: 59 164 83.4 155 3367
          Percentage of the requests served within a certain time (ms)
          50% 155
          66% 178
          75% 196
          80% 206
          90% 237
          95% 263
          98% 287
          99% 305
          100% 3367 (longest request)

          3、結果摘要

            請求時間(秒) 單次請求時間(毫秒) 最大內存占用(MB) 最小內存占用(MB)
          None 10.41 96.08 24 24
          APC 30.45 32.84 21 21
          eAccelerator 31.26 31.99 23 18
          XCache 30.28 33.02 29 19

          四、PHP加速器比較結果總結

               1、通過測試得出eAccelerator在請求時間和內存占用綜合方面是最好的。

               2、通過測試得出使用加速器比無加速器在請求時間快了3倍左右。

               3、通過各個官方觀察,XCache是更新最快的,這也說明最有發展的。

                  以上是總結結果,你也許會問我到底用那個加速器好呢?我只能告訴你,首先,用一定比不用好,其次每個加速器還有一些可以調優的參數,所以要根據你的系統環境而定,然后,我個人覺得你可以詳細研究下eAccelerator和XCache,這兩款潛力還是很大的,最后我從比較專業的測試網站搞了一張結果圖:

          cache

          本文轉載自:http://killker.com/blog/?p=94

          posted @ 2010-04-16 10:00 小馬歌 閱讀(239) | 評論 (0)編輯 收藏
           
          自已電腦上裝的apache突然間,內存及cpu占用率一直飆升。 找了篇文章解決了。順便發來這里轉轉

           

          所謂Apache出現CPU高占用率就是指Apache在一段時間內持續占用很高的CPU使用率,甚至達到CPU100%,這個時候造成網站無法訪問。解決的方法就是仔細觀察Apache的日志文件,查閱錯誤的信息。

          下面我們針對幾種錯誤信息進行分析并給出解決的方法:

          1. Apache與WinSock v2相沖突
          Apache官方提供的手冊中提到,在Windows系統下Apache2.x為了提高性能而使用了Microsoft WinSock v2 API,但是一些常見的防火墻軟件會破壞他的正確性,從而使得Apache出現死循環操作造成CPU100%。

          其錯誤提示如下所示:

          [error] (730038)An operation was attempted on something that is not a socket.: winnt_accept: AcceptEx failed. Attempting to recover.

          [error] (OS 10038) : Child 3356: Encountered too many errors accepting client connections. Possible causes: dynamic address renewal, or incompatible VPN or firewall software. Try using the Win32DisableAcceptEx directive.

          [warn] (OS 121)信號燈超時時間已到。 : winnt_accept: Asynchronous AcceptEx failed.

          [warn] (OS 64)指定的網絡名不再可用。 : winnt_accept: Asynchronous AcceptEx failed.

          可以依次采用下面的方法來解決上面的問題,如果進行了一步還有問題就繼續下一步:

          1) 在httpd.conf文件中使用 Win32DisableAcceptEx 禁止Apache使用 Microsoft WinSock v2 API :

          <IfModule mpm_winnt.c>
          Win32DisableAcceptEx # 禁止使用AcceptEx()
          </IfModule>

          2) 使用System Repair Engineer(SREng)查看WinSocket供應者,如果出現非MS的陌生項則將其刪除,并使用軟件的“重置WinSocket”按鈕進行重置。

          3) 卸載與Apache相沖突的殺毒軟件或防火墻軟件。

          如果進行上面的三個步驟之后還有問題,那應該看看是不是還有下面的錯誤。

          2. 是否加載了第三方模塊(so文件)
          Apache2.x要求所有的第三方模塊都必須是線程安全的,但有很多第三方的模塊可能存在內存泄露,因此時間一長就可以極大的消耗Apache資源。所以可以采用將所有的第三方模塊逐個關閉的方法看看運行一段時間之后Apache對資源的占用是否有所改善。

          3. “Terminating 1 threads that failed to exit”錯誤
          上面錯誤中的數字1有可能是其他數字,造成這個錯誤的原因是Apache在關閉并發線程的時候出現線程溢出,從而造成內存泄露,表現出來的就是Apache所占用的系統資源持續增長。

          具體來說,Apache的子進程在結束當前請求之前會首先將所有的并發線程進行關閉,在關閉的時候會等待3分鐘,如果3分鐘之內沒有將所有的線程關 閉則會拋出上述的錯誤提示,然后強制關閉。這樣就造成了內存溢出,時間一長會使得Apache所占用資源持續增長直到無法工作。這個時候可以適當將MaxRequestsPerChild的值降低,使得Apache子進程所并發的線程數量減少,從而降低該錯誤出現的幾率。

          但是這種方式并不能徹底解決問題,幸好Apache2.0.x的最新版本(2.0.63)解決了之前版本的這個問題,如果3分鐘之內有線程沒有關閉的話會自動根據時間情況再增加等待結束的時間直到最終將所有的線程結束。日志文件中會出現類似下面的信息:

          Child 1952: Waiting 150 more seconds for 2 worker threads to finish.
          Child 1952: Waiting 120 more seconds for 1 worker threads to finish.
          Child 1952: All worker threads have exited.

          4. “file .\\server\\mpm\\winnt\\child.c, line 1078, assertion “(rv >= 0) && (rv < threads_created)” failed” 錯誤

          這個錯誤是Apache的一個bug(#11997),可以通過 Win32DisableAcceptEx 禁止Apache使用WinSocket v2來避免此bug,具體設置見前述。

          5. PHP5.2.1以上版本的libmysql.dll與MySQL5不兼容
          PHP5.2.1以后的新版本(截止目前最新版本為5.2.5)中用于連接MySQL的libmysql.dll組件與MySQL5不兼容,在Apache中運行PHP的時候會造成Apache產生CPU100%的問題。

          解決的方法就是從http://www.php.net/releases/下載5.2.1版本,將壓縮包中的libmysql.dll文件覆蓋現在的文件,然后重啟Apache就可以了。

          6. 病毒或木馬程序命名為Apache.exe
          有的時候病毒或木馬程序會將其名稱命名為Apache.exe文件達到一種掩飾的目的,這個時候使用第三方進程分析器查看進程的路徑然后將其刪除或使用殺毒軟件清除就可以了。

          7. 程序編寫不嚴謹造成死循環等錯誤
          如果上面的問題都不存在Apache依然產生CPU100%的問題的話,通常來說就應該是Web程序自身的問題了,例如死循環等等。這個時候需要在日志中設置HTTP請求的文件及執行的時間,然后查找出執行時間比較長的地址進行分析排查。

          日志格式設置如下:

          LogFormat “%v %h %l %u %t [%Ts] \”%r\” %>s %b” vhost_common #設置程序執行時間

          <VirtualHost xxx.xxx.xx.xx:80>
          ServerName xxx.xxx.com
          DirectoryIndex index.php index.html index.htm
          DocumentRoot “xxx”
          # cronolog.exe用于將日志文件進行分割的應用程序,可以在 http://cronolog.org/ 下載
          CustomLog “|bin/cronolog.exe e:/%Y%m%d.log” vhost_common

           

           

          原文出處: http://www.javatang.com/archives/2008/01/22/0615259.html

          posted @ 2010-04-15 15:19 小馬歌 閱讀(853) | 評論 (0)編輯 收藏
           
          解決方法:
          1. 在/etc/httpd/conf/httpd.conf的最后添加如下內容
               CoreDumpDirectory /var/apache-dump
          2. 創建該目錄,并設置正確的權限和屬主:
               # ps aux | grep http | tail -n 2
               # mkdir /var/apache-dump
               # chown apache.apache /var/apache-dump     
          注:修改屬主為ps axu|grep httpd顯示的apache進程的運行身份和組
               # chmod 0770 /var/apache-dump
               # ls -ld /var/apache-dump
               drwxrwx---    2 apache   apache   4096 Aug 16 10:59 /var/apache-dump
          3. 修改/etc/security/limits.conf,添加:
               *               -       core    unlimited
          4. 編輯/etc/profile,修改:
               ulimit -S -c 0 > /dev/null 2>1

               ulimit -S -c unlimited > /dev/null 2>1
          5. 編輯/etc/init.d/functions,在下面一行添加一個"#",將其注釋掉:
                  ulimit -S -c 0 >/dev/null 2>1

                  #ulimit -S -c 0 >/dev/null 2>1
          6. 編輯/etc/init.d/httpd,在start()部分的第一行添加ulimit -c如下:
               start() {
                       ulimit -c unlimited
                       echo -n $"Starting $prog: "
          7. 實現重新起動后將PID寫入到core文件,修改/etc/sysctl.conf,添加:
               kernel.core_uses_pid = 1
               # Following needed for Enterprise Linux 3 servers
               kernel.core_setuid_ok = 1   
          同時,可以手工運行下面命令使得立刻生效:
               # echo 1 > /proc/sys/kernel/core_uses_pid
               # echo 1 > /proc/sys/kernel/core_setuid_ok
          8. 重新起動或者重新啟動apache:
                   service httpd restart
          9. 為了測試,使用ps aux查找apache進程,然后kill-ll ,檢查/var/apache-dump/目錄查找新的core文件:
               # ps aux | grep htt | tail -n 2
               apache    1331  0.0  2.6 80152 6776 ?        S    13:59   0:00 /usr/sbin/httpd -
               apache    1333  0.0  2.6 80152 6776 ?        S    13:59   0:00 /usr/sbin/httpd -
               # kill -11 1333
               # ls -ld /var/apache-dump/core.1333
               -rw-------    1 apache   apache   71188480 Aug 16 13:48 /var/apache-dump/core.1333
          一旦得到core文件,可以查看core文件,進行debug。
          posted @ 2010-04-15 15:00 小馬歌 閱讀(295) | 評論 (0)編輯 收藏
           
          Linux在具有高穩定性、可靠性的同時,具有很好的可伸縮性和擴展性,能夠針對不同的應用和硬件環境調整,優化出滿足當前應用需要的最佳性能。因此企業在維護Linux系統、進行系統調優時,了解系統性能分析工具是至關重要的。

            在Linux下有很多系統性能分析工具,比較常見的有top、free、ps、time、timex、uptime等。下文將介紹幾個較為重要的性能分析工具vmstat、iostat和sar及其使用。

          vmstat監視內存使用情況

            vmstat是Virtual Meomory Statistics(虛擬內存統計)的縮寫,可對操作系統的虛擬內存、進程、CPU活動進行監視。它是對系統的整體情況進行統計,不足之處是無法對某個進程進行深入分析。

            首先,什么是virtual memory? 簡單的說,linux支持應用程序使用比實際內存更大的內存空間,這是通過將硬盤上一個特定的分區(swap分區)或者一個特定的文件作為內存的擴展來做到的。當實際內存不夠用時,linux根據某種策略,將內存中的部分空間寫到交換分區以便留出應用程序運行所需要的內存空間(參考:Understanding Virtual Memory , What is Vitual Memory)。但是,一旦開始使用交換空間,磁盤活動自然就多起來,cpu利用率就降低下來(因為磁盤的速度比內存和cpu慢多了)。這就是為什么vmstat會同時顯示磁盤和cpu活動情況的原因。

            vmstat的語法如下:

          CODE:
          vmstat [-V] [-n] [delay [count]]
          [Copy to clipboard]


            其中,-V表示打印出版本信息;-n表示在周期性循環輸出時,輸出的頭部信息僅顯示一次;delay是兩次輸出之間的延遲時間;count是指按照這個時間間隔統計的次數。

            vmstat輸出的各個字段的含義可以參考man vmstat的解釋,下面就我的理解說一下vmstat常用的幾種使用方式。

          1、觀察磁盤活動情況

            磁盤活動情況主要從以下幾個指標了解:
            bi:表示從磁盤每秒讀取的塊數(blocks/s)。數字越大,表示讀磁盤的活動越多。
            bo:表示每秒寫到磁盤的塊數(blocks/s)。數字越大,表示寫磁盤的活動越多。
            wa:cpu等待磁盤I/O(未決的磁盤IO)的時間比例。數字越大,表示文件系統活動阻礙cpu的情況越嚴重,因為cpu在等待慢速的磁盤系統提供數據。wa為0是最理想的。如果wa經常大于10,可能文件系統就需要進行性能調整了。

          procs:
          r-->在運行隊列中等待的進程數
          b-->在等待io的進程數
          w-->可以進入運行隊列但被替換的進程
          memoy
          swap-->現時可用的交換內存(k表示)
          free-->空閑的內存(k表示)
          pages
          re--》回收的頁面
          mf--》非嚴重錯誤的頁面
          pi--》進入頁面數(k表示)
          po--》出頁面數(k表示)
          fr--》空余的頁面數(k表示)
          de--》提前讀入的頁面中的未命中數
          sr--》通過時鐘算法掃描的頁面
          disk 顯示每秒的磁盤操作。 s表示scsi盤,0表示盤號
          fault 顯示每秒的中斷數
          in--》設備中斷
          sy--》系統中斷
          cy--》cpu交換
          cpu 表示cpu的使用狀態
          cs--》用戶進程使用的時間
          sy--》系統進程使用的時間
          id--》cpu空閑的時間
          如果 r經常大于 4 ,且id經常少于40,表示cpu的負荷很重。
          如果pi,po 長期不等于0,表示內存不足。
          如果disk 經常不等于0, 且在 b中的隊列 大于3, 表示 io性能不好。


          2、觀察cpu活動情況

            vmstat比top更能反映出cpu的使用情況:
            us:用戶程序使用cpu的時間比例。這個數字越大,表示用戶進程越繁忙。
            sy:系統調用使用cpu的時間比例。注意,NFS由于是在內核里面運行的,所以NFS活動所占用的cpu時間反映在sy里面。這個數字經常很大的話,就需要注意是否某個內核進程,比如NFS任務比較繁重。如果us和sy同時都比較大的話,就需要考慮將某些用戶程序分離到另外的服務器上面,以免互相影響。
            id:cpu空閑的時間比例。
            wa:cpu等待未決的磁盤IO的時間比例。

          用iostat監視I/O子系統情況

            iostat是I/O statistics(輸入/輸出統計)的縮寫,iostat工具將對系統的磁盤操作活動進行監視。它的特點是匯報磁盤活動統計情況,同時也會匯報出CPU使用情況。同vmstat一樣,iostat也有一個弱點,就是它不能對某個進程進行深入分析,僅對系統的整體情況進行分析。

            iostat的語法如下:

          CODE:
          iostat [ -c | -d ] [ -k ] [ -t ] [ -V ] [ -x [ device ] ] [ interval [ count ] ]
          [Copy to clipboard]


            其中,-c為匯報CPU的使用情況;-d為匯報磁盤的使用情況;-k表示每秒按kilobytes字節顯示數據;-t為打印匯報的時間;-v表示打印出版本信息和用法;-x device指定要統計的設備名稱,默認為所有的設備;interval指每次統計間隔的時間;count指按照這個時間間隔統計的次數。

            iostat一般的輸出格式如下:

          CODE:
          Linux 2.4.18-18smp (builder.linux.com) 2003年03月07日

          avg-cpu: %user %nice %sys %idle
          4.81 0.01 1.03 94.15

          Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
          dev3-0 30.31 1117.68 846.52 16104536 12197374
          dev3-1 7.06 229.61 40.40 3308486 582080

          [Copy to clipboard]

          device顯示設備名
          r/s顯示每秒讀磁盤操作的次數
          w/s 顯示每秒寫磁盤操作的次數
          kr/s 顯示每秒讀數據總量 單位K
          kw/s 顯示每秒寫數據總量 單位K
          wait 顯示平均的等待事務數量
          actv 顯示正在處理的平均事務總量
          svc_t 顯示憑據服務周期 單位 ms
          %w 顯示等待時間的百分數
          %b 顯示磁盤工作時間的百分數


            對于輸出中各字段的含義,iostat的幫助中有詳細的說明。

          使用sar進行綜合分析


          引用:
          表1 sar參數說明

          選項 功能
          -A 匯總所有的報告
          -a 報告文件讀寫使用情況
          -B 報告附加的緩存的使用情況
          -b 報告緩存的使用情況
          -c 報告系統調用的使用情況
          -d 報告磁盤的使用情況
          -g 報告串口的使用情況
          -h 報告關于buffer使用的統計數據
          -m 報告IPC消息隊列和信號量的使用情況
          -n 報告命名cache的使用情況
          -p 報告調頁活動的使用情況
          -q 報告運行隊列和交換隊列的平均長度
          -R 報告進程的活動情況
          -r 報告沒有使用的內存頁面和硬盤塊
          -u 報告CPU的利用率
          -v 報告進程、i節點、文件和鎖表狀態
          -w 報告系統交換活動狀況
          -y 報告TTY設備活動狀況

           

            sar是System Activity Reporter(系統活動情況報告)的縮寫。顧名思義,sar工具將對系統當前的狀態進行取樣,然后通過計算數據和比例來表達系統的當前運行狀態。它的特點是可以連續對系統取樣,獲得大量的取樣數據;取樣數據和分析的結果都可以存入文件,所需的負載很小。sar是目前Linux上最為全面的系統性能分析工具之一,可以從14個大方面對系統的活動進行報告,包括文件的讀寫情況、系統調用的使用情況、串口、CPU效率、內存使用狀況、進程活動及IPC有關的活動等,使用也是較為復雜。

            sar的語法如下:

          CODE:
          sar [-option] [-o file] t [n]
          [Copy to clipboard]


            它的含義是每隔t秒取樣一次,共取樣n次。其中-o file表示取樣結果將以二進制形式存入文件file中。

            另一種語法如下:

          CODE:
          sar [-option] [-s time] [-e time] [-i sec] [-f file]
          [Copy to clipboard]


            含義是表示從file文件中取出數據,如果沒有指定-f file,則從標準數據文件/var/adm/sa/sadd取數據,其中dd表示當前天。另外,-s time表示起始時間;-e time表示停止時間;-i sec表示取樣的時間間隔,如果不指定則表示取文件中所有的數據。對于具體的選項參見表1。

            一般它與-q和-u聯合使用,以便對每個CPU的使用情況進行分析,比如運行如下命令:

          CODE:
          sar -q -u 5 1
          [Copy to clipboard]


            將輸出如下:

          CODE:
          Linux 2.4.18-18smp (builder.linux.com) 2003年03月07日

          09時46分16? CPU %user %nice %system %idle
          09時46分21? all 0.20 0.00 0.00 99.80

          09時46分16? runq-sz plist-sz ldavg-1 ldavg-5
          09時46分21? 0 91 0.00 0.00

          Average: CPU %user %nice %system %idle
          Average: all 0.20 0.00 0.00 99.80

          Average: runq-sz plist-sz ldavg-1 ldavg-5
          Average: 0 91 0.00 0.00

          [Copy to clipboard]


            由于sar命令太復雜,只有通過熟練使用才能了解每個選項的含義,對于sar輸出中每個字段的含義運行man sar命令可以得到詳細的解釋。

          posted @ 2010-04-15 12:36 小馬歌 閱讀(378) | 評論 (0)編輯 收藏
           
          from : http://jeremy.zawodny.com/blog/archives/011421.html

          I've recently been accumulating some MySQL configuration variables that have defaults which have proven to be problematic in a high-volume production environment. The thing they all have in common is a network blip or two can trigger some very undesirable behavior.

          max_connect_errors

          If a client is having trouble connecting to MySQL, the server will give up waiting after connect_timeout seconds and increment the counter which tracks the number of connect errors it has seen for the host. Then, when that value reaches max_connect_errors, the client will be locked out until you issue a FLUSH HOSTS command. Worse yet, if you have occasionally network blips and never need to restart your MySQL boxes, these errors can accumulate over time and eventually cause you middle of the night pain.

          See in the MySQL docs. Sadly, there is no way to disable this check entirely. Setting the variable to 0 doesn't accomplish that. Your only real solutions are (a) setting it to a very high value (max_connect_errors=1844674407370954751), and (b) running an occasional FLUSH HOSTS command.

          connect_timeout

          This is related to the above problem. In situations of network congestion (either at the client or server), it's possible for an initial connection to take several seconds to complete. But the default value for connect_timeout is 5 seconds. When you trip over that, the max_connect_errors problem above kicks in.

          To avert this, try setting connect_timeout to a value more like 15 or 20. And also consider making thread_cache_size a non-zero value. That will help in situations when the server occasionally gets a high number of new connections in a very short period of time.

          skip-name-resolve

          MySQL does a reverse DNS lookup on every incoming connection by default. This sucks. It seems that no matter how good your infrastructure is, there are blips in DNS service. MySQL's host cache exists to keep those lookups to a minimum. Yet I've seen this cause pain off and on for eight years now. I can only assume there's a bug in the host cache or the resolver library when this happens.

          I recommend adding skip-name-resolve to your /etc/my.cnf to skip DNS entirely. Just use IP addresses or ranges for your GRANTs. It seems that slow replies from DNS servers can also help you to trip over connect_timeout as well. Imagine having 2 or 3 DNS servers configured but the first one is unavailable.

          slave_net_timeout

          When the network connection between a master and slave database is interrupted in a way that neither side can detect (like a firewall or routing change), you must wait until slave_net_timeout seconds have passed before the salve realizes that something is wrong. It'll then try to reconnect to the master and pick up where it left off. That's awesome.

          However, the default value is 3600 seconds. That's a full hour! FAIL.

          Who wants their slaves to sit idle for that long before checking to see if something might be wrong? I can't think of anyone who wants that.

          My suggestion, if you're in a busy environment, is that you set that to something closer to 30 seconds.

          posted @ 2010-04-12 12:42 小馬歌 閱讀(286) | 評論 (0)編輯 收藏
           
          from : http://www.justwinit.cn/post/2734/

          [不指定 2010/02/27 17:40 | by root ]
          當前的連接數:
          mysql> show status like '%Threads_connected%';
          +-------------------+-------+
          | Variable_name     | Value |
          +-------------------+-------+
          | Threads_connected | 27    |
          +-------------------+-------+
          1 row in set (0.00 sec)

          最大連接數:
          show variables like '%max_connections%';
          set GLOBAL max_connections=800;
          flush privileges
          也可以修改/etc/my.cnf中的max_connections:
          max_connections = 1000

          關于php應該在何時調用mysql_close()以及pconnect方式和傳統方式有何種區別收藏
          以前我一直認為,當php的頁面執行結束時,會自動釋放掉一切。相信很多人都跟我想的一樣。但事實證明并不是這樣。比如session就不會隨著頁面執行完畢而釋放。
          php的垃圾回收機制,其實只針對于php本身。對于mysql,php沒權利去自動去釋放它的東西。如果你在頁面執行完畢前不調用mysql_close(),那么mysql那邊是不會關閉這個連接的。如果你是用的是pconnect方式,即使你在頁面執行完畢前調用mysql_close(),也無法另mysql關閉這個連接。
          也許在負載低的情況下,你感受不到有何不妥。但是,一旦負載很高,就回出現很多的死鏈接,于是得殺掉它們,現象:
          在php中使用pconnect方式建立連接,然后到mysql客戶端下執行show processlist;如果你的負載到一定程度的話,你可以看到很多sleep的進程,這些進程就是人們常說的死連接,它們會一直保持sleep,直到my.cnf里面設置的wait_timeout這個參數值的時間到了,mysql才會自己殺死它。在殺死它的時候,mysql還會在error-log里面記錄一條Aborted connection xxx to db: 'xxx' user: 'xxx' host: 'xxx'的日志,用google翻譯一下,會得到一個相當強悍的解釋"胎死腹中的連接"!
          那么造成sleep的原因,有三個,下面是mysql手冊給出的解釋:
          1.客戶端程序在退出之前沒有調用mysql_close().[寫程序的疏忽,或者數據庫的db類庫沒有自動關閉每次的連接。。。]
          2.客戶端sleep的時間在wait_timeout或interactive_timeout規定的秒內沒有發出任何請求到服務器. [類似常連,類似于不完整的tcp ip協議構造,服務端一直認為客戶端仍然存在(有可能客戶端已經斷掉了)]
          3.客戶端程序在結束之前向服務器發送了請求還沒得到返回結果就結束掉了. [參看:tcp ip協議的三次握手]




          網上有一個哥們寫了一個,如下:

          <?php
          define('MAX_SLEEP_TIME', 120);

          $hostname = "localhost";
          $username = "root";
          $password = "password";

          $connect = mysql_connect($hostname, $username, $password);
          $result = mysql_query("SHOW PROCESSLIST", $connect);
          while ($proc = mysql_fetch_assoc($result)) {
              if ($proc["Command"] == "Sleep" && $proc["Time"] > MAX_SLEEP_TIME) {
                  @mysql_query("KILL " . $proc["Id"], $connect);
              }
          }
          mysql_close($connect);
          ?>


          將它當中的 $password 改成你實際的數據庫密碼,死連接的時間也可以修改。然后加入計劃任務就可以了。比如用 crontab -e 命令加入:

          */2 * * * * php /usr/local/sbin/kill-mysql-sleep-proc.php就可以每隔 2 分鐘檢查并清除一次數據庫中的死連接了。


          我結合自己的實際改寫如下:

          <?php

          require_once 'services/UserServices*.class.php';
          define('MAX_SLEEP_TIME', 120);//注意調試的時候這兒只能修改120,而不能在重新定義,常量一旦定義好,就不能被重新定義了。PHP預先定義了幾個常量,并提供了一種機制在運行時自己定義。常量和變量基本上是一樣的,不同的是:常量必須用DEFINE函數定義,常量一旦定義好,就不能被重新定義了。
          $scoreServ = new TMService ( );
          $sql = "SHOW PROCESSLIST";
          $proc = $scoreServ*->query($sql);
          foreach($proc as $oneproc)
          {
              if ($oneproc["Command"] == "Sleep" && $oneproc["Time"] >= MAX_SLEEP_TIME)
              {
                 $query = "KILL " . $oneproc["Id"];
                 echo $query."\n";
                 @$scoreServ*->query($query);
              }
          }

          ?>

          crontab 加入:

          */2 * * * * /usr/local/php/bin/php /usr/local/tads/htdocs/*/src/crontable/killmysqlsleepproc.php


          聽說可以做mysql的設置也可以的如下:


          配置MYSQL里的參數。超時時間設置。
          max_connections:
          允許的同時客戶的數量。負載過大時,你將經常看到 too many connections 錯誤。已達到最大鏈接數,所以會出現這種情況。 我們服務器數值是200。
          wait_timeout            
          服務器在關閉連接之前在一個連接上等待行動的秒數,默認數值是28800,即如果沒有事情發生,服務器在 8個小時后關閉連接。防止sleep過而導致出現too many connections


          如果你的sleep進程數在同一時間內過多,再加上其他狀態的連接,總數超過了max_connection的值,那mysql除了root用戶外,就無法再繼續處理任何請求無法與任何請求建立連接或者直接down了。所以,這個問題在大負載的情況下還是相當嚴重的。如果發現你的mysql有很多死連接存在,首先要先檢查你的程序是否使用的是pconnect的方式,其次,檢查在頁面執行完畢前是否及時調用了mysql_close(),


          還有一個辦法,你可以在my.cnf里面加上wait_timeout和interactive_timeout,把他們的值設的小一些,默認情況下wait_timeout的值是8小時的時間,你可以改成1個小時,或半個小時。這樣mysql會更快的殺死死連接。防止連接總數超過max_connection的值。或者把max_connection的值設置的更大,不過這樣顯然不妥,連接的數量越多,對你服務器的壓力越大。實際上那些連接都是冗余的,把它們盡快殺死才是上策。




          以前總是說,在使用php連接mysql的時候,盡量不要使用pconnect的方式,看完我上面所說的那些,應該可以明白為什么了吧,因為我們使用php大多數情況下都是做web開發,web開發是面向多用戶,那么用戶的數量與mysql連接數是成正比的。使用pconnect的方式,即使你的調用mysql_close()也是無法釋放數據庫連接的,那么mysql中的死連接的數量就會越來越多了。



          我認為,只有當你的應用屬于那種點對點方式,或者你能保證連接數量很少的情況,才有必要去采用pconnect的方式,因為連接數量少,那么讓它一直處于連接狀態,避免了重復打開關閉的過程。這樣可能會比傳統方式更好一些。



          至于何時該去調用mysql_close(),最正確的做法是如果下面不再執行mysql的操作了,在你上一次執行完mysql操作后,立刻就調用mysql_close()。這才是最正確的做法,并不是總要把mysql_close()寫在頁面最后一行就可以了。

          如果你沒有修改過MySQL的配置,缺省情況下,wait_timeout的初始值是28800。

          wait_timeout過大有弊端,其體現就是MySQL里大量的SLEEP進程無法及時釋放,拖累系統性能,不過也不能把這個指設置的過小,否則你可能會遭遇到“MySQL has gone away”之類的問題,通常來說,我覺得把wait_timeout設置為10是個不錯的選擇,但某些情況下可能也會出問題,比如說有一個CRON腳本,其中兩次SQL查詢的間隔時間大于10秒的話,那么這個設置就有問題了(當然,這也不是不能解決的問題,你可以在程序里時不時mysql_ping一下,以便服務器知道你還活著,重新計算wait_timeout時間): # vi /etc/my.cnf

          [mysqld]

          wait_timeout=10

          # /etc/init.d/mysql restart
          復制代碼不過這個方法太生硬了,線上服務重啟無論如何都應該盡可能避免,看看如何在MySQL命令行里通過SET來設置: mysql> set global wait_timeout=10;

          mysql> show global variables like '%timeout';

          +----------------------------+-------+

          | Variable_name              | Value |

          +----------------------------+-------+

          | wait_timeout               | 10    |

          +----------------------------+-------+
          復制代碼這里一個容易把人搞蒙的地方是如果查詢時使用的是show variables的話,會發現設置好像并沒有生效,這是因為單純使用show variables的話就等同于使用的是show session variables,查詢的是會話變量,只有使用show global variables,查詢的才是全局變量。

          網絡上很多人都抱怨說他們set global之后使用show variables查詢沒有發現改變,原因就在于混淆了會話變量和全局變量,如果僅僅想修改會話變量的話,可以使用類似set wait_timeout=10;或者set session wait_timeout=10;這樣的語法。

          另一個值得注意的是會話變量wait_timeout初始化的問題,這一點在手冊里已經明確指出了,我就直接拷貝了:
          On thread startup, the session wait_timeout value is initialized from the global wait_timeout value or from the global interactive_timeout value, depending on the type of client (as defined by the CLIENT_INTERACTIVE connect option to mysql_real_connect()).

          MySQL大拿Jeremy Zawodny曾在他的文章Fixing Poor MySQL Default Configuration Values里面列出了幾個很惡心的MySQL缺省設置,不過沒包含wait_timeout,但我覺得它也應該算一個,每次新裝MySQL后最好都記得修改它。

          以上的修改配置來源網頁:http://www.tech-q.cn/redirect.php?tid=4005&goto=lastpost


          mysql>show variables like '%timeout';
          打印結果如下:
          +----------------------------+-------+
          | Variable_name | Value |
          +----------------------------+-------+
          | connect_timeout | 5 |
          | delayed_insert_timeout | 300 |
          | interactive_timeout | 28800 |
          | net_read_timeout | 30 |
          | net_write_timeout | 60 |
          | slave_net_timeout | 3600 |
          | wait_timeout | 28800 |
          +----------------------------+-------+

          interactive_timeout 需在mysql_connect()設置CLIENT_INTERACTIVE選項后起作用,并被賦值為wait_timeout;
          mysql>set wait_timeout = 10; 對當前交互鏈接有效;
          mysql>set interactive_timeout = 10; 對后續起的交互鏈接有效;

          該超時時間單位是秒,從變量從上次SQL執行后算起;當前空閑若超過該時間,則也會被強制斷開。


          想把mysql的連接斷開時間改長一些,以前只改了connect_timeout變量的值,還不夠。現在又改了這兩個,不知夠不夠。不夠再繼續查吧。

          注意:對兩個值都做修改才生效:set interactive_timeout=120; set wait_timeout=120;


          mysql> show variables like '%timeout';
          +-------------------------+-------+
          | Variable_name           | Value |
          +-------------------------+-------+
          | connect_timeout         | 5     |
          | delayed_insert_timeout  | 300   |
          | interactive_timeout     | 28800 |
          | net_read_timeout        | 30    |
          | net_write_timeout       | 60    |
          | slave_net_timeout       | 3600  |
          | table_lock_wait_timeout | 50    |
          | wait_timeout            | 28800 |
          +-------------------------+-------+


          mysql> set interactive_timeout=120; set wait_timeout=120;
          Query OK, 0 rows affected (0.00 sec)

          mysql> show variables like '%timeout';
          +-------------------------+-------+
          | Variable_name           | Value |
          +-------------------------+-------+
          | connect_timeout         | 5     |
          | delayed_insert_timeout  | 300   |
          | interactive_timeout     | 120   |
          | net_read_timeout        | 30    |
          | net_write_timeout       | 60    |
          | slave_net_timeout       | 3600  |
          | table_lock_wait_timeout | 50    |
          | wait_timeout            | 120   |
          +-------------------------+-------+

          修改全局變量:
          set global interactive_timeout=120;set global wait_timeout=120;


          mysql> show global variables like '%timeout';
          +-------------------------+-------+
          | Variable_name           | Value |
          +-------------------------+-------+
          | connect_timeout         | 5     |
          | delayed_insert_timeout  | 300   |
          | interactive_timeout     | 120   |
          | net_read_timeout        | 30    |
          | net_write_timeout       | 60    |
          | slave_net_timeout       | 3600  |
          | table_lock_wait_timeout | 50    |
          | wait_timeout            | 120   |
          +-------------------------+-------+

          特別注意全局和一般變量時不一樣的兩個變量,這也就是為何導致修改沒有起作用的原因!!!!


          配置修改:
          直接的修改 /etc/my.cnf這個文件中

          -------------------------------------------
          [mysqld]

          wait_timeout = 86400
          interactive_timeout = 86400
          --------------------------------------------
          添加這兩行,然后重新啟動mysql服務就OK了
          文章來源:http://blog.chinaunix.net/u2/60332/showart_2096857.html

          近一段時間,部門同事反映在使用mysql的過程出現數據庫連接問題

          應用程序和數據庫建立連接,如果超過8小時應用程序不去訪問數據庫,數據庫就斷掉連接 。這時再次訪問就會拋出異常,如下所示:

          java.io.EOFException
              at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1913)
              at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2304)
              at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2803)
              at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1573)
          ...

          查了一下發現應用程序和mysql數據庫建立連接,如果超過8小時應用程序不去訪問數據庫,數據庫就斷掉連接 。這時再次訪問就會拋出異常。

          關于mysql自動斷開的問題研究結果如下,在mysql中有相關參數設定,當數據庫連接空閑一定時間后,服務器就會斷開等待超時的連接:
          1、相關參數,紅色部分
          mysql> show variables like '%timeout%';
          +--------------------------+-------+
          | Variable_name            | Value |
          +--------------------------+-------+
          | connect_timeout          | 5     |
          | delayed_insert_timeout   | 300   |
          | innodb_lock_wait_timeout | 50    |
          | interactive_timeout      | 28800 |
          | net_read_timeout         | 30    |
          | net_write_timeout        | 60    |
          | slave_net_timeout        | 3600 |
          | wait_timeout             | 28800 |
          +--------------------------+-------+        
          同一時間,這兩個參數只有一個起作用。到底是哪個參數起作用,和用戶連接時指定的連接參數相關,缺省情況下是使用wait_timeout。我建議是將這兩個參數都修改,以免引起不必要的麻煩。


          2、修改參數
          這兩個參數的默認值是8小時(60*60*8=28800)。我測試過將這兩個參數改為0,結果出人意料,系統自動將這個值設置為1。換句話說,不能將該值設置為永久。
          將這2個參數設置為24小時(60*60*24=604800)即可。
          set interactive_timeout=604800;
          set wait_timeout=604800;

          也可以修改my.cof,修改后重起mysql
          打開/etc/my.cnf,在屬性組mysqld下面添加參數如下:
          [mysqld]
          interactive_timeout=28800000
          wait_timeout=28800000

          如果一段時間內沒有數據庫訪問則mysql自身將切斷連接,之后訪問java訪問連接池時對數據庫的數據通道早就關閉了,因為dbcp連接池無法時時維護與數據庫的連接關系,mysql5以后即使在dbcp配置中加入autoReconnect=true也沒有效果。


          言歸正傳,接著來,shell腳本實現如下:

          #!/bin/sh
          注:這個腳本運行后會每五秒去檢測一次 mysql的sleep進程數

          while :
          do
            n=`/usr/bin/mysqladmin processlist | grep -i sleep | wc -l`
            date=`date +%Y%m%d\[%H:%M:%S]`
            echo $n

            if [ "$n" -gt 10 ]
            then
              for i in `/usr/bin/mysqladmin processlist | grep -i sleep | awk '{print $2}'`
              do
                /usr/bin/mysqladmin kill $i
              done
              echo "sleep is too many i killed it" >> /tmp/sleep.log
              echo "$date : $n" >> /tmp/sleep.log
            fi
          sleep 5
          done


          crontab實現:不會循環的腳本(配合crontab使用)

          #!/bin/sh
          n=`/usr/bin/mysqladmin processlist | grep -i sleep | wc -l`
          date=`date +%Y%m%d\[%H:%M:%S]`
          echo $n
          if [ "$n" -gt 10 ]
          then
          for i in `/usr/bin/mysqladmin processlist | grep -i sleep | awk '{print $2}'`
          do
          /usr/bin/mysqladmin kill $i
          done
          echo "sleep is too many i killed it" >> /tmp/sleep.log
          echo "$date : $n" >> /tmp/sleep.log
          fi


          你可能還會用到查詢mysql當前連接數:
          1.show status
             Threads_connected  當前的連接數
             Connections  試圖連接到(不管是否成功)MySQL服務器的連接數。
             Max_used_connections  服務器啟動后已經同時使用的連接的最大數量。
          2.set GLOBAL max_connections=連接數;
             flush privileges
          3.修改/etc/my.cnf中的max_connections
          4.show processlist   顯示當前正在執行的mysql連接
          5.mysqladmin -u<user> -p<pwd> -h<host> status
             顯示當前mysql狀態
             Uptime: 13131  Threads: 1  Questions: 22  Slow queries: 0  Opens: 16  Flush tables: 1  Open tables: 1  Queries per second avg: 0.1
             mysqladmin -u<user> -p<pwd> -h<host> extended-status
             顯示mysql的其他狀態
          +-----------------------------------+----------+
          | Variable_name                     | Value    |
          +-----------------------------------+----------+
          | Aborted_clients                   | 0        |
          | Aborted_connects               | 1        |
          | Binlog_cache_disk_use       | 0        |
          | Binlog_cache_use               | 0        |
          | Bytes_received                   | 1152   |
          | Bytes_sent                         | 10400 |
          | Com ......


          參看:
          http://www.justwinit.cn/post/2262/
          http://www.coolcode.cn/?action=show&id=237
          http://www.eb163.com/club/thread-1708-1-1.html
          http://hualulu.com/blog/?p=16
          http://www.51testing.com/?uid-199-action-viewspace-itemid-76740
          補充:

          netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'


          會得到類似下面的結果,具體數字會有所不同:

          LAST_ACK 1
          SYN_RECV 14
          ESTABLISHED 79
          FIN_WAIT1 28
          FIN_WAIT2 3
          CLOSING 5
          TIME_WAIT 1669

          狀態:描述
          CLOSED:無連接是活動的或正在進行
          LISTEN:服務器在等待進入呼叫
          SYN_RECV:一個連接請求已經到達,等待確認
          SYN_SENT:應用已經開始,打開一個連接
          ESTABLISHED:正常數據傳輸狀態
          FIN_WAIT1:應用說它已經完成
          FIN_WAIT2:另一邊已同意釋放
          ITMED_WAIT:等待所有分組死掉
          CLOSING:兩邊同時嘗試關閉
          TIME_WAIT:另一邊已初始化一個釋放
          LAST_ACK:等待所有分組死掉

          也就是說,這條命令可以把當前系統的網絡連接狀態分類匯總。

          下面解釋一下為啥要這樣寫:

          一個簡單的管道符連接了netstat和awk命令。

          ------------------------------------------------------------------

          先來看看netstat:

          netstat -n

          Active Internet connections (w/o servers)
          Proto Recv-Q Send-Q Local Address Foreign Address State
          tcp 0 0 123.123.123.123:80 234.234.234.234:12345 TIME_WAIT

          你實際執行這條命令的時候,可能會得到成千上萬條類似上面的記錄,不過我們就拿其中的一條就足夠了。

          ------------------------------------------------------------------

          再來看看awk:

          /^tcp/
          濾出tcp開頭的記錄,屏蔽udp, socket等無關記錄。

          state[]
          相當于定義了一個名叫state的數組

          NF
          表示記錄的字段數,如上所示的記錄,NF等于6

          $NF
          表示某個字段的值,如上所示的記錄,$NF也就是$6,表示第6個字段的值,也就是TIME_WAIT

          state[$NF]
          表示數組元素的值,如上所示的記錄,就是state[TIME_WAIT]狀態的連接數

          ++state[$NF]
          表示把某個數加一,如上所示的記錄,就是把state[TIME_WAIT]狀態的連接數加一

          END
          表示在最后階段要執行的命令

          for(key in state)
          遍歷數組

          print key,"\t",state[key]
          打印數組的鍵和值,中間用\t制表符分割,美化一下。

          如發現系統存在大量TIME_WAIT狀態的連接,通過調整內核參數解決,
          vim /etc/sysctl.conf
          編輯文件,加入以下內容:
          net.ipv4.tcp_syncookies = 1
          net.ipv4.tcp_tw_reuse = 1
          net.ipv4.tcp_tw_recycle = 1
          net.ipv4.tcp_fin_timeout = 30
          然后執行 /sbin/sysctl -p 讓參數生效。

          net.ipv4.tcp_syncookies = 1 表示開啟SYN Cookies。當出現SYN等待隊列溢出時,啟用cookies來處理,可防范少量SYN攻擊,默認為0,表示關閉;
          net.ipv4.tcp_tw_reuse = 1 表示開啟重用。允許將TIME-WAIT sockets重新用于新的TCP連接,默認為0,表示關閉;
          net.ipv4.tcp_tw_recycle = 1 表示開啟TCP連接中TIME-WAIT sockets的快速回收,默認為0,表示關閉。
          net.ipv4.tcp_fin_timeout 修改系統默認的 TIMEOUT 時間

          下面附上TIME_WAIT狀態的意義:

          客戶端與服務器端建立TCP/IP連接后關閉SOCKET后,服務器端連接的端口
          狀態為TIME_WAIT

          是不是所有執行主動關閉的socket都會進入TIME_WAIT狀態呢?
          有沒有什么情況使主動關閉的socket直接進入CLOSED狀態呢?

          主動關閉的一方在發送最后一個 ack 后
          就會進入 TIME_WAIT 狀態 停留2MSL(max segment lifetime)時間
          這個是TCP/IP必不可少的,也就是“解決”不了的。

          也就是TCP/IP設計者本來是這么設計的
          主要有兩個原因
          1。防止上一次連接中的包,迷路后重新出現,影響新連接
          (經過2MSL,上一次連接中所有的重復包都會消失)
          2。可靠的關閉TCP連接
          在主動關閉方發送的最后一個 ack(fin) ,有可能丟失,這時被動方會重新發
          fin, 如果這時主動方處于 CLOSED 狀態 ,就會響應 rst 而不是 ack。所以
          主動方要處于 TIME_WAIT 狀態,而不能是 CLOSED 。

          TIME_WAIT 并不會占用很大資源的,除非受到攻擊。

          還有,如果一方 send 或 recv 超時,就會直接進入 CLOSED 狀態

          sleep() 和 wait() 有什么區別?
          sleep是線程類(Thread)的方法,導致此線程暫停執行指定時間,給執行機會給其他線程,但是監控狀態依然保持,到時后會自動恢復。調用sleep不會釋放對象鎖。在sleep 時間間隔期滿后,線程不一定立即恢復執行。這是因為在那個時刻,其它線程可能正在運行而且沒有被調度為放棄執行,除非(a)“醒來”的線程具有更高的優先級,(b)正在運行的線程因為其它原因而阻塞。

          wait是Object類的方法,對此對象調用wait方法導致本線程放棄對象鎖,釋放當前線程鎖定的任何對象。進入等待此對象的等待鎖定池,只有針對此對象發出notify方法(或notifyAll)后本線程才進入對象鎖定池準備獲得對象鎖進入運行狀態。

          sleep()方法是本地方法,屬于Thread類,它有兩種定義:

          public static native void sleep(long millis) throws InterruptedException;  

          public static void sleep(long millis, int nanos) throws InterruptedException {  

              //other code  

          }  

          其中的參數millis代表毫秒數(千分之一秒),nanos代表納秒數(十億分之一秒)。這兩個方法都可以讓調用它的線程沉睡(停止運行)指定的時間,到了這個時間,線程就會自動醒來,變為可運行狀態(RUNNABLE),但這并不表示它馬上就會被運行,因為線程調度機制恢復線程的運行也需要時間。調用sleep()方法并不會讓線程釋放它所持有的同步鎖;而且在這期間它也不會阻礙其它線程的運行。上面的2個方法都聲明拋出一個 InterruptedException類型的異常,這是因為線程在sleep()期間,有可能被持有它的引用的其它線程調用它的 interrupt()方法而中斷。中斷一個線程會導致一個InterruptedException異常的產生,如果你的程序不捕獲這個異常,線程就會異常終止,進入TERMINATED狀態,如果你的程序捕獲了這個異常,那么程序就會繼續執行catch語句塊(可能還有finally語句塊)以及以后的代碼。

          為了更好地理解interrupt()效果,我們來看一下下面這個例子:

          public class InterruptTest {  

              public static void main(String[] args) {  

                  Thread t = new Thread() {  

                      public void run() {  

                          try {  

                              System.out.println("我被執行了-在sleep()方法前");  

                              // 停止運行10分鐘  

                              Thread.sleep(1000 * 60 * 60 * 10);  

                              System.out.println("我被執行了-在sleep()方法后");  

                          } catch (InterruptedException e) {  

                              System.out.println("我被執行了-在catch語句塊中");  

                          }  

                          System.out.println("我被執行了-在try{}語句塊后");  

                      }  

                  };  

                  // 啟動線程  

                  t.start();  

                  // 在sleep()結束前中斷它  

                  t.interrupt();  

              }  

          }  

          運行結果:

          我被執行了-在sleep()方法前

          我被執行了-在catch語句塊中

          我被執行了-在try{}語句塊后



          wait()方法也是本地方法,屬于Object類,有三個定義:

          public final void wait() throws InterruptedException {  

              //do something  

          }  


          連接數過多會出現:
          root@darkstar:~# mysql
          ERROR 1040 (00000): Too many connections
          你只有選擇:
          mysqladmin 執行kill 進程:
          ./mysqladmin -uroot -p processlist
          ./mysqladmin -uroot -p kill idnum


          假如只有一個哥們A進入mysql,后買的人BCD由于已經連接吃緊咋辦?
          方法如下:
          1.
          show processlist \G;
          粘貼下來后放入文本:mysqlkillid.txt

          cat mysqlkillid.txt |grep  Id: |awk '{print "kill "$2";"}'
          kill 180414;
          kill 180433;
          kill 180438;
          kill 180446;
          kill 180454;
          kill 180455;
          kill 180456;
          kill 180457;
          kill 180458;
          kill 180460;
          kill 180461;
          kill 180462;

          然后粘貼到mysql里面去殺死的同時讓其他同事連接mysql,可能某個時候就可以進入了。




          本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/yakihappy/archive/2009/03/11/3979914.aspx

          回憶未來,向東,沒時間整理:)
          最后編輯: root 編輯于2010/03/17 15:40
          posted @ 2010-04-12 12:41 小馬歌 閱讀(5626) | 評論 (2)編輯 收藏
          僅列出標題
          共95頁: First 上一頁 61 62 63 64 65 66 67 68 69 下一頁 Last 
           
          主站蜘蛛池模板: 南康市| 阿鲁科尔沁旗| 綦江县| 宜春市| 凤城市| 鄂托克旗| 若羌县| 特克斯县| 南乐县| 越西县| 景东| 调兵山市| 兰溪市| 鹰潭市| 佛冈县| 普兰县| 楚雄市| 大荔县| 工布江达县| 水富县| 高雄市| 浪卡子县| 雅江县| 锦屏县| 泰和县| 广平县| 什邡市| 昆山市| 临泽县| 玉山县| 天津市| 广宗县| 霸州市| 南部县| 高碑店市| 常德市| 富川| 开化县| 新建县| 神农架林区| 西宁市|