診斷 Solaris 8 伺服器記憶體和交換空間使用情況

診斷 Solaris 8 伺服器記憶體和交換空間使用情況

本質上,我的問題與 Solaris 虛擬機器的記憶體分配有關。

我在兩台 Solaris 8 虛擬機器上運行幾個舊的 Sun ONE 6 Java Web 伺服器。我發現正在使用合理數量的交換空間,但我不確定這是否表明需要向這些計算機添加更多 RAM。

在服務高峰時段(通常是早上),這些伺服器所託管的 Web 應用程式的回應時間最多可達 11 秒(對於相對簡單的網頁載入作業來說有些不利)。非尖峰時段平均反應時間約5秒。

您能從下面的輸出推斷出這些機器的 RAM 使用情況嗎?這些資訊是否夠充分?或者我需要運行一些其他命令來排除伺服器記憶體不足的情況?

最後,由於設定的核心是 Java 應用程序,因此我還考慮了:

1) 追蹤堆的物件分配以偵測潛在的記憶體洩漏。

2) 進行一些效能分析,看看這是否與網路延遲有關。我提到這一點是因為應用程式與單一 Oracle 資料庫進行通信,但我懷疑情況是否如此,因為從網路分段的角度來看它們非常接近。

我感謝您提供的任何見解和反饋。

感謝您的時間和幫助。

伺服器1:

40 processes:  38 sleeping, 1 zombie, 1 on cpu
CPU states: 99.1% idle,  0.4% user,  0.4% kernel,  0.0% iowait,  0.0% swap
Memory: 2048M real, 295M free, 865M swap in use, 3788M swap free

   PID USERNAME THR PRI NICE  SIZE   RES STATE    TIME    CPU COMMAND
 12676 webservd 112  29   10  616M  242M sleep  103:37  0.48% webservd
 18317 root       1  59    0   23M   19M sleep   67:24  0.08% perl
  9479 support    1  59    0 6696K 2448K cpu/1    0:11  0.05% top
  8012 root      10  59    0   34M  704K sleep   80:54  0.04% java
  1881 root      33  29   10  110M   13M sleep   33:03  0.02% webservd
  7808 root       1  59    0   83M   67M sleep    7:59  0.00% perl
  1461 root      20  59    0 5328K 1392K sleep    6:49  0.00% syslogd
  1691 root       2  59    0   27M  680K sleep    4:22  0.00% webservd
 24386 root       1  59    0   15M   11M sleep    2:50  0.00% perl
 23259 root       1  59    0   11M 4240K sleep    2:42  0.00% perl
 24718 root       1  59    0   11M 5464K sleep    2:29  0.00% perl
 22810 root       1  59    0   19M   11M sleep    2:21  0.00% perl
 24451 root       1  53    2   11M 3800K sleep    2:18  0.00% perl
 18501 root       1  56    1   11M 3960K sleep    2:18  0.00% perl
 14450 root       1  56    1   15M 6920K sleep    1:49  0.00% perl

伺服器2

 42 processes:  40 sleeping, 1 zombie, 1 on cpu
CPU states: 98.8% idle,  0.4% user,  0.8% kernel,  0.0% iowait,  0.0% swap
Memory: 1024M real, 31M free, 554M swap in use, 3696M swap free

   PID USERNAME THR PRI NICE  SIZE   RES STATE    TIME    CPU COMMAND
  5607 webservd  74  29   10  284M  173M sleep   20:14  0.21% webservd
 15919 support    1  59    0 4056K 2520K cpu/1    0:08  0.09% top
 13138 root      10  59    0   34M 1952K sleep  210:51  0.08% java
 13753 root       1  59    0   22M   12M sleep  170:15  0.07% perl
 22979 root      33  29   10  112M 7864K sleep   85:07  0.04% webservd
 22930 root       1  59    0 3424K 1552K sleep   17:47  0.01% xntpd
 22978 root       2  59    0   27M 2296K sleep   10:49  0.00% webservd
 13571 root       1  59    0 9400K 5112K sleep    5:52  0.00% perl
  5606 root       2  29   10   29M 9056K sleep    0:36  0.00% webservd
 15910 support    1  59    0 9128K 2616K sleep    0:00  0.00% sshd
 13106 root       1  59    0   82M 3520K sleep    7:47  0.00% perl
 13547 root       1  59    0   12M 5528K sleep    6:38  0.00% perl
 13518 root       1  59    0 9336K 3792K sleep    6:24  0.00% perl
 13399 root       1  56    1 8072K 3616K sleep    5:18  0.00% perl
 13557 root       1  53    2 8248K 3624K sleep    5:12  0.00% perl

答案1

要確定您的伺服器是否缺少 RAM,一個有用的指標是 vmstat 命令輸出中的 sr 列。只需在參考期和峰值期(每 10 秒 10 個樣本)運行類似的操作vmstat 10 10並發布輸出即可。swap -s輸出也將很有用。除了 vmstat 之外,您可能更願意運行sar -g 5 5 。 Solaris 有一個類似 top 的支援指令,也可能有助於辨識虛擬和實體記憶體使用者:

prstat -s rss -n 5
prstat -s size -n 5

答案2

這些快照中對我來說最突出的事情如下:

  • 許多 Perl 進程
  • 多個 webservd 進程
  • 機器 98% 和 99% 處於閒置狀態

這些事實引出了以下問題...

  • 可以減少 perl 進程的數量嗎?
  • 我想沒有辦法切換到線程網路伺服器模型嗎?
  • 當機器承受壓力時,系統頂部會是什麼樣子?

最後,我會執行以下操作來追蹤此問題:

  • 使用像 Wireshark 這樣的網路嗅探器來查看 HTTP 進程的哪一部分實際上被封鎖了。是連接嗎?是頁面的傳送嗎?它是頁面動態部分的交付嗎?
  • 取得 HTTP 壓力工具並對您的 Web 伺服器施加壓力,看看它們如何反應。使用 vmstat 和 top 觀察回應:我喜歡在終端中使用 screen 來執行此操作。

祝你好運!

答案3

我一直發現追蹤記憶體使用情況的最簡單方法是系統統計。它可能會跳很多次,因此至少檢查一周以了解使用模式非常重要。

編輯“sys”crontab,您將看到腳本 /usr/lib/sa/sa1 的一些註解掉的執行。它運行的頻率決定了保存的會計資料的時間解析度。我通常對 24x7 系統做這樣的事情:

20,40 * * * * /usr/lib/sa/sa1

這將按該月的某一天將統計資料儲存在 /var/adm/sa 中。現在,您可以使用 sar 轉儲其中儲存的任意日期的記憶體統計資料。假設第三天對我來說是高峰日:

sar -f /var/adm/sa/sa03 -g

主要感興趣的列是 pgscan/s。如果該數字長時間超過 200,則係統記憶體不足。在 100 時,您可能會受益於更多的內存,但退化並不嚴重。如今,磁碟交換比內存慢得多,除了短期跳躍之外,我嘗試將其保持在 0。

相關內容