[英]sysread overhead for Perl in Linux
我有一個網絡守護程序,該守護程序在TCP套接字上接收固定長度(44字節)的消息。
我試圖確定我應該使用sysread讀取的最佳字節長度是多少。 我當然可以做一個循環,執行44字節的sysread,但是我想提供一個最佳大小。
我可以看到不必說的好處,那就是可以進行價值數百萬字節的數據替換,但是我也可以看到為什么進行一千次sysread調用會導致速度變慢。
通過公共互聯網進行系統讀取是否有合適的大小建議?
編輯:腳本獲取一堆44字節的消息,它們排隊。
越大越好! 只要有可用字節, sysread
就會返回。
由於永遠不能保證得到完整的消息,並且永遠不能保證沒有多條消息,因此需要在Perl端進行循環。 由於您已經在Perl端有了一個循環,因此您最好一次從系統中獲取盡可能多的數據,以避免不必要的系統調用。
use constant READ_SIZE => 65*1024;
my $buf = '';
while (1) {
my $rv = sysread($fh, $buf, READ_SIZE, length($buf));
die if !defined($rv);
last if !$rv;
while ($buf =~ s/^(.{44})//s) {
my $msg = $1;
process_msg($msg);
}
}
選擇一個大小並監視$buf
的大小。 如果它經常接近READ_SIZE
,請增加READ_SIZE
。
我不確定開銷是多少,只有您可以測量一個是否比另一個更快,但是如果我嘗試在晴朗的藍天下嘗試某個大小,那么我將首先使用4092
字節。 這樣一來,您最多可以處理93條消息,而且它的大小不到4Kb的大小,這聽起來像是一個不錯的起點。
您可以在程序正在運行的系統上找到頁面大小 ,然后進行相應調整。 我將從int(PAGE_SIZE / MESSAGE_SIZE)
,看看對於每條消息,它的性能是否都比一個sysread
好。
另一方面, perl
默認使用8KB緩沖區 :
192 /* The default buffer size for the perlio buffering layer */
193 #ifndef PERLIOBUF_DEFAULT_BUFSIZ
194 #define PERLIOBUF_DEFAULT_BUFSIZ (BUFSIZ > 8192 ? BUFSIZ : 8192)
195 #endif
系統調用不會復制未傳輸的字節。 如果您有一條44字節的消息,perl將始終返回一個44字節的字符串。 您提供的大小僅僅是最大值,用於確定提供給內核的緩沖區的大小。 提供超過44個字節的價值在於,如果有多個消息排隊,您將在單個系統調用中將它們全部獲取。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.