本質上,我的問題與 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。