SSRS 阻塞程序
我們有一個繁忙的 SSRS 報告伺服器 (SQL Server 2008 R2),我們看到以下程序之間經常出現阻塞:
- $$ dbo $$.$$ CheckSessionLock $$
- $$ dbo $$.$$ WriteLockSession $$
我們知道有些報告的執行速度慢得令人無法接受。我需要知道的是 ReportServer 數據庫中的阻塞是否是伺服器過載的症狀,或者阻塞是否導致報告執行緩慢。
我傾向於相信這是第一個案例,但無法收集證據明確證明這一點。
我已經閱讀了https://connect.microsoft.com/SQLServer/feedback/details/698388/blocking-in-ssrs-reportserver-database上的執行緒,其中問題得到了鬆散的承認,但我無法訪問引用的連結以解決這個問題。
在 ReportServer 數據庫中是否存在阻塞問題?
不幸的是,您對此無能為力,這種行為是設計使然。當使用者會話超時時,問題就會顯現出來,因為報告花費了太多時間。您可以嘗試改進報告,或將會話超時配置為比執行時間最長的報告長一點
有關原因和一些解決方法的說明,請參閱此連結。
您可以增加會話超時作為某種解決方法,該腳本記錄在文章中。
來自文章:
但是,在一種情況下 ping 不起作用,那就是在初始報告執行期間。問題是,在執行報告時,使用者的會話被鎖定(因為我們正在填充使用者的臨時快照)並且來自查看器控制項的 keepalive 將被阻止。通常,這不是問題,因為報表執行不應該花費很長時間,而且它們通常會在會話超時之前完成。不幸的是,在某些情況下,報告(無論出於何種原因)需要非常長的時間才能執行。在這種情況下發生的情況是,在執行報告時使用者的會話已過期,從而導致各種奇怪的行為。
假設您有 SQL 2008R2 或更高版本。
是的,我們在我們的一個重度使用的 SSRS 報告伺服器上也看到了同樣的情況,並且在故障排除時遇到了這個連接項,它被註冊為一個錯誤。
如解釋:
SSRS 發出這些鎖以提供多執行緒機制。一旦所有執行您編寫的報告的執行緒結束,鎖定就會被移除。因此,如果您看到這些,通常是在導致問題的不同伺服器上的緩慢查詢。
有些問題可能在重負載時發生(或者他們這麼說),有些報告稱排序問題會阻止 CleanExpiredSessions 執行。
還,
此行為是設計使然。為了使其會話保持活躍,查看器控制項會嘗試每 10 分鐘對它們進行一次 ping 操作。在伺服器端,它會呼叫 GetSessionData 儲存過程,它從呼叫 CheckSessionLock 儲存過程開始,它會嘗試讀取會話寫鎖。如果在 ping 發生時報告處理仍在執行,則 CheckSessionLock 阻塞,因為在處理報告時持有會話寫鎖。GetSessionData 超時為 10 分鐘(“SessionAccessTimeout”系統屬性)。如果報告處理時間超過 20 分鐘,則會發生 GetSessionData 超時並且您會看到此問題。
有關此內容的更多閱讀和解決方案,請參閱執行期間的會話超時