共用方式為


絕佳的記憶體 商務用 Skype

本文是由呈報工程師 商務用 Skype Kenn Guilstorf 所撰寫。

身為呈報工程師,我協助客戶解決一些更「特別」的 商務用 Skype 問題。 最近,我收到許多「以效能為基礎」的案例,基本上,關於 商務用 Skype 速度緩慢或緩慢、不允許應用程式共用,或只是使用太多記憶體的抱怨。 許多時候,這些案例的調查會顯示使用者已讓 商務用 Skype 執行數周;而且,經過一段時間后,記憶體就會建立,直到影響效能為止。 當我讓Skype長時間執行時,我甚至已經注意到它。 那麼,Skype 的用途為何,以及為什麼它會保存太多記憶體? (以下是一些提示:這是正常且設計。沒有任何錯誤 – 任何原生程式都會執行到 this.)

它可穿透多少記憶體?

修正任何問題的第一個步驟是了解問題,而瞭解任何問題的第一個步驟是加以定義。 這並不像聽起來那麼容易。

商務用 Skype (SfB) 第一次啟動時,如果您可以將 100 MB 計算為小型) ,則記憶體使用量會比較小 (。 我們可以在任意數目的工具中看到這種情況,例如任務管理

顯示 [任務管理器] 視窗中記憶體值為 83,428K 之 Lync 應用程式詳細數據的螢幕快照。

圖 1:不要被騙:Lync.exe 是 SfB (32 位版本的進程名稱)

經過一段時間后,進程所使用的記憶體數量將會成長。 它成長的大小取決於使用多少 Skype、其用途等等。 例如,以下是大約 24 小時後相同的用戶端:

顯示 [任務管理器] 視窗中記憶體成長至 115,196K 之 Lync 應用程式詳細數據的螢幕快照。

圖 2:相同的 SfB 24 小時之後

因此,Skype 在 24 小時內耗用了大約 32 MB。 這並不多,對吧? 其實不是,直到我解釋 Skype 在這 24 小時內都處於閑置狀態為止。 基本上,我已開始在計算機上 商務用 Skype、鎖定計算機,並等候約 24 小時才解除鎖定。 在使用中,收費會高很多,特別是如果我加入會議、在這些會議中使用應用程式共用或桌面共用、使用IM等等。 我看過一天 商務用 Skype 記憶體使用量成長到 300–500 MB 的情況。 在使用一或多周之後,事情可能會變得很費時,尤其是在記憶體受限的32位用戶端上。

顯示記憶體

有許多工具可以分析記憶體。 其中一個最受歡迎的工具 -至少至少是 Microsoft – 是 SysInternals 工具 VMMap,可在 VMMap v3.26 取得。 我們可以使用它來查看進程記憶體,並查看是否可以分析 商務用 Skype 記憶體。

下載 VMMap 之後,請執行它。 啟動時,它會開啟進程清單,讓您可以選擇要檢查的進程。 我會選擇 [lync.exe ],然後按兩下 [ 確定]

顯示 V m 地圖開頭的螢幕快照,其中已選取 Lync。

圖 3:開始時的 VMMap

接下來,您會看到一個圖形,代表您所選取可執行檔目前記憶體配置檔的多色表示 -Lync.exe,在此案例中為 。

顯示記憶體配置檔多色表示的螢幕快照。

圖 4:針對最近啟動的 VMMap 開始 Lync.exe

這裡有許多資訊,而且描述這一切會填滿一或多篇自己的部落格文章。 如果您有興趣,有數個很棒的書籍和在線文章可協助您加以說明。 (個人化,我建議使用易失列印功能的「進階 Windows」,但仍然非常適合說明記憶體的運作方式。您可以在您最愛的書市找到其已使用的複本。)

如您所見,[ 任務 管理器] 中顯示的記憶體與 VMMap 中的任何類別不一致。 任務管理 員是更一般化的表示法;正確,只是不計算所有專案。 VMMap 更全面。

以下是在等候 24 小時之後的 Skype 實例:

顯示24小時後Skype V m地圖的螢幕快照。

圖 5:24 小時後適用於 Skype 的 VMMap

內存在哪裡?

如果您比較每個個別的類別,則不會有任何實際的對齊。 實際上,要尋找耗用記憶體的專案很難執行,因為記憶體類別會隨著物件和記憶體要求的提出和釋放而變動,而且記憶體會保留並認可以儲存各種物件。 基於此部落格的目的,「知識核心」 (,) 是「免費」類別。 在我們的範例中,「可用」記憶體是 Lync 可執行檔「保留」的所有可用空間。 但是只有特定類型的「已認可」記憶體會顯示在 任務管理器中。 保留的記憶體不會計算,因為它不在使用中。

那麼,內存在哪裡? 因為記憶體不會遺失,所以難以找出。 與熱門的信念相反,Skype 小組並未被傳統型記憶體製造商降除。 沒有任何惡意的繪圖可讓客戶升級任何系統或記憶體。 這甚至不是計劃性過時的情況。 事實有點難以解釋。

讓我們回溯一下,讓事情更清楚。 當您第一次啟動 商務用 Skype 用戶端時,其記憶體使用量相對較小 , 通常為 100 MB 左右,視其為您追蹤的聯繫人數目及其他額外負荷 (您可以在上述數據中清楚地看到) 。 幾天之後,您會發現此使用量會成長數十萬個字節到數 MB。 在某些情況下,這可能是問題,但不一定是 商務用 Skype 本身的問題。 而是 Windows 程式設計範例的效果,以及它以原生方式處理記憶體的方式。

Windows 程式設計為何?

我只會在這裡提供 Windows 記憶體的簡單檢視。 Windows 記憶體是透過計算機週期和資源的昂貴 (來處理,) 稱為配置和取消配置的程式。 當程式需要記憶體時,它會要求 Windows 配置它。 當記憶體經過時,程式會要求 Windows 取消配置它。 在內部,Windows 會經歷數個進程來管理記憶體要求。

提出要求時,Windows 會檢查已認可至進程的記憶體,但進程並未使用。 Windows 想要查看是否有足夠大的記憶體區塊可供使用。 如果有,系統會使用它,並繼續其快樂的方式。 如果沒有,則會檢查保留的記憶體。 如果有夠大的保留記憶體區塊,它會將它認可 (在操作系統定義的區塊中,稱為「頁面」) ,並將變數儲存在其中。 現在已認可記憶體,而我們剛成長了可執行檔的記憶體使用量。

如果沒有足夠的保留記憶體來處理要求,會發生什麼事? 如果可以的話,操作系統會嘗試保留更多記憶體。 以下是32位架構與64位架構之間的差異。 32 位進程最多只能使用 4 GB 的記憶體。 這是因為 4 GB 是 32 位緩存器可尋址的最大數量。 (A 位只能保存 1 或 0 – 二進位檔。因此,32 位表示 232 是允許) 的最高位址。 由於有32位架構,只有大約2 GB的記憶體會指派給進程本身,其餘部分則由操作系統用來對應一般 DLL、處理一般內核模式物件等等。 在 64 位系統中,64 位長緩存器可以處理 264,這會是大約 18 個 exabytes。 不過,視 Windows 版本而定,Windows 會以人為方式將可保留的記憶體數量限制為 2 TB 到 4 TB (TB) 。

保留記憶體之後,它會獲得認可,然後像以前一樣使用。 除了一或兩個小型但重要的詳細數據之外,取消配置程式大致上是相反的。

首先,除非要求,否則 Windows 永遠不會「清除」記憶體。 當記憶體解除配置時,它會在 Windows 記憶體對應中標示為 可用 。 不論保留的是什麼,都會保留在該處,直到被另一個配置覆寫為止。 接下來,除非要求,否則 Windows 很少會取消認可記憶體。 如先前所述,記憶體作業相當耗用資源。 因此,如果程式需要先前配置的記憶體,Windows 會假設它可能再次需要該記憶體,並且會保留取消認可記憶體,直到它絕對需要為止。 最後,Windows 永遠不會「聯合」記憶體。 這表示 Windows 釋放的記憶體永遠不會「匯總」,而且可用記憶體區塊永遠不會「一起移動」,以建立較大的可用記憶體區塊。 (所有這些函式都會合併成稱為「垃圾收集」的類別。.NET Framework 有一些垃圾收集功能。不過,商務用 Skype 是「原生」或 non-.NET application.)

商務用 Skype 每秒處理許多變化大小的物件。 它必須這麼做,才能成為我們想要成為令人驚豔的工具。 我們要求其管理聯繫人、管理行事曆 (會議) 、與朋友、學生和同事的IM,甚至使用語音和視訊與他們交談、共用桌面或視窗等等。 舉例來說明晚期的絕佳 Robert Heinlein 等等:「沒有免費午餐。」

管理這類不同且通常可變大小的眾多物件,會建立不同大小的記憶體區塊配置和取消配置。 經過一段時間后,這會造成記憶體分散 ,有時嚴重,這會增加 商務用 Skype的記憶體使用量。

範例可能更能說明這一點。 假設 Skype (或任何原生程式,實際上) 配置 64 個對象,編號為 1-64,每個物件大小為 4 K 個字節:

顯示 Skype 64 物件的螢幕快照。

圖 6:64 個物件,每個物件使用 4 KB 的記憶體

這會導致 256 KB 的記憶體配置和承諾用量。 現在,假設程式不需要偶數物件,因此它會釋放它們:

顯示所有已發行偶數對象的螢幕快照。

圖 7:釋放所有偶數物件可釋放 128 KB 的記憶體!

如果您使用 VMMap 或類似的工具) 來查看整體記憶體 (的較大概觀,您會看到其中一個認可的數據行可能 (堆積 區段中 ,但其確切取決於程式要求記憶體) 減少 128 KB 的方式,而 Free 區段已成長 128 KB。 在任務管理器中,程式現在只擁有 128 KB 的記憶體位元組。

接下來假設我們的程式有一個必須儲存的單一 8 KB 物件。 這應該很簡單。 畢竟,它有 128 KB 的可用。 不過,嘗試儲存該 8 KB 物件會建立新的記憶體保留,而不是將記憶體記憶體記憶體保留,而不是將記憶體記憶體記憶體保留,而不是將記憶體記憶體存在 128 KB 的可用空間中。 這是因為,如果您查看記憶體,您會看到它仍分成 4 KB 的區塊! Windows 沒有足夠的記憶體區塊可保存 8 KB 物件,因此必須保留更多記憶體並認可給程式。

這是相當精心設計的範例,但它說明瞭Skype記憶體管理的困難度。 Skype 會管理大量沒有可輕易定義大小的物件。 這些對象的長度都是變化的。 這表示,當物件儲存並釋放時,特別是一段很長的時間,例如天數或數周,記憶體片段可能會變得嚴重,而且因為 Windows 必須配置更多記憶體來儲存新的物件,所以記憶體使用量會過度增加。

當這會在 32 位用戶端中造成問題時,我們經常建議移至 64 位用戶端,因為由於 64 位與 32 位架構,記憶體的限制遠小於 64 位。 不過,過多的記憶體成長,以及其他考慮,甚至會導致64位用戶端的緩慢。 這些其他考慮包括整體系統記憶體、磁碟速度 (,因為程式記憶體通常由 Windows 分頁檔) 中的虛擬記憶體支援、開啟多少其他應用程式等等。 在這兩種情況下,隨著 商務用 Skype 記憶體使用量隨著時間成長,其執行情況就越差。 在 32 位用戶端案例中,這可能會導致 Skype 所需的較大物件 ,例如應用程式共用的內部緩衝區,空間不足,並導致失敗。

公平地說,記憶體只是一段時間耗用的資源, 但最明顯 。 句柄使用量可能會增加、線程會隨著時間增加、分頁集區內存將會增加等等。 這些增加都會對程式造成影響,在某些情況下也會影響整個操作系統。 這是我們建議使用者每天結束並重新啟動 Skype (,或至少每周) 作為最佳做法的原因之一,甚至是針對 64 位用戶端。

我該怎麼做,我可以強制Skype重新啟動嗎?

有數種方式可以強制 Skype 重新啟動,但沒有單一的最佳方式。 當然,其中一種方式是使用者教育。 在大部分情況下,使用者是其桌面使用量的仲裁者,因此在離開一天時,教導他們註銷並關閉 Skype 是很費意的。 您也可以撰寫自定義腳本或可執行文件,然後以工作排程器工作的方式執行其中一個腳本或可執行檔,作為必要步驟來完成此作業。 該方法有點不在意,即使「使用中」 (,也可能會導致Skype循環,雖然這可透過工作排程器條件) 來稍微降低。 桌面電腦和計算機管理、潛在的 BIOS 選項等等也有第三方機會。

最後一個底線是,最好 商務用 Skype 每天迴圈,或至少每周迴圈。 如果您可以訓練使用者定期回收 商務用 Skype,或者,至少當事情變得異常時,您可能會有較少的技術服務人員通話和更多快樂的使用者。