下面來看一下這個問題:
問題出現
官方troubleshooting如下:
Message Code 27740
Overlapped transmission of request to '%1' for URL 'URL' failed.
The transmission of data to the server failed. It could be a network, router, or server problem. The word Overlapped refers to the way LoadRunner sends data in order to get a Web Page Breakdown. Troubleshooting Add the following statement to the beginning of the script to disable the breakdown of the "First Buffer" into server and network time: web_set_sockets_option("OVERLAPPED_SEND", "0"); |
解決方式
添加:web_set_sockets_option("OVERLAPPED_SEND", "0")語句。
解析原因
IO Overlapped是一種異步IO,在socket層,只有少量數據發送的時候,只要create new thread,send, receive,就可以了。但是,當數據量增加的時候,要考慮資源的充分利用,也要避免資源的擁塞隊列,如果創建線程過多,和CPU內存磁盤等資源的交互過多,可能導致擁塞出現。在這時就要考慮資源的擁塞問題了,在socket中有兩種處理的方式:
1, IO overlapped
工作方式是這樣的:
A:調用WSARecv, WSARecvFrom, WSASend, WSASendTo, 或 WSAIoctl.等函數,傳入overlapped參數,表示這個函數要執行這個動作;
B:調用WSAGetOverlappedResult函數來取數據;
C:再執行A,調用另一個帶有overlapped的參數另一個線程交替處理。
這種方式,可以處理一定量的數據。但是在大數據量的時候,這種處理方式顯示出了先天的不足。因為使用這種方式會創建新的線程,這樣勢必增加系統的開銷。當出現成千上萬的線程時,系統的開銷已經相當大了,因為要頻繁的在上下文之間切換。所以在socket編程里,這種方式,處理線程數不是很大的情況下是比較有優勢的。
2, IO completion port
在winsock2中引入了異步IO的API:IOCP。其實這里也是overlapped的理念。但有不同,如下描述:
這種異步IO的工作方式是:先開一些線程,處在hold的狀態下,應用線程和completion port關聯起來,當某個線程要處理數據時,就與completion port進行通信,這樣就可以進行socket操作了,這種處理方式就是在剛開始的時候,消耗一些資源開線程,處理大數據量的socket通信,如圖:

這樣一來completion port就可以處理threads和IO Device之間的交互了。
打個比方來說:
有很多人早上都去坐地鐵,但是,如果不限制人往站臺走的速度,售票口就要增加很多個才能處理乘客的請求,這樣成本就會增加很多,并且站臺上最后會擠滿了人,最后導致危機出現;而現在,在進入地鐵的時候,加上有序的限流措施,這樣一來售票口不用增加,也可以處理乘客的請求,站臺上就不會有那么大的壓力。
在我的理解中,completion port就有著這么一個功能。在處理大數據量的時候,它起著維持秩序的作用。
以上為socket在處理數據量較大時的兩種方式。
而在性能測試中,如果開的線程過多,可能某些資源不足導致不停的上下文切換,就會有thread得不到資源,從而出現pending。
如果我們關閉了overlapped,就會同步執行。這時如果CPU速度夠快(同時其他資源是足夠用的),是可以處理所有請求,并且不會出現pending的。但是,如果thread開的越來越多,也可能導致CPU處理不了,從而出現CPU頻繁的上下文切換,或者隊列增長。最后出錯。這時,我們可以針對性的來提出解決方案了。
打個比方來說:
有很多人早上都去坐地鐵,但是,如果不限制人往站臺走的速度,售票口就要增加很多個才能處理乘客的請求,這樣成本就會增加很多,并且站臺上最后會擠滿了人,最后導致危機出現;而現在,在進入地鐵的時候,加上有序的限流措施,這樣一來售票口不用增加,也可以處理乘客的請求,站臺上就不會有那么大的壓力。
在我的理解中,completion port就有著這么一個功能。在處理大數據量的時候,它起著維持秩序的作用。
以上為socket在處理數據量較大時的兩種方式。
而在性能測試中,如果開的線程過多,可能某些資源不足導致不停的上下文切換,就會有thread得不到資源,從而出現pending。
如果我們關閉了overlapped,就會同步執行。這時如果CPU速度夠快(同時其他資源是足夠用的),是可以處理所有請求,并且不會出現pending的。但是,如果thread開的越來越多,也可能導致CPU處理不了,從而出現CPU頻繁的上下文切換,或者隊列增長。最后出錯。這時,我們可以針對性的來提出解決方案了。
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/