簡體   English   中英

Linux中Perl的sysread開銷

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM