<HTML xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<HEAD><!-- Template generated by Exclaimer Template Editor on 10:00:43 Dinsdag, 17 Oktober 2017 -->
<STYLE type=text/css>P.1465a867-2f2c-496e-bd65-eca506eae656 {
        MARGIN: 0cm 0cm 0pt
}
LI.1465a867-2f2c-496e-bd65-eca506eae656 {
        MARGIN: 0cm 0cm 0pt
}
DIV.1465a867-2f2c-496e-bd65-eca506eae656 {
        MARGIN: 0cm 0cm 0pt
}
TABLE.1465a867-2f2c-496e-bd65-eca506eae656Table {
        MARGIN: 0cm 0cm 0pt
}
DIV.Section1 {
        page: Section1
}
</STYLE>

<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
<meta name="Generator" content="Microsoft Word 14 (filtered medium)" />
<style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</HEAD>

<BODY lang="EN-US" link="blue" vlink="purple">
<P>
<div class="WordSection1">
<p class="MsoNormal">Hi All,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">While investigating a system that transfers lots of refc binaries, I tried measuring the amount of data in the message queue of a process. I noticed that the binaries in the message queue are not always included in the result of process_info(Pid,
 binary).<o:p></o:p></p>
<p class="MsoNormal">In particular, when observing the binaries, I see time intervals when each of the new messages appear in the binary list, and time intervals when the binary list stays the same regardless of new messages in the queue.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I made a simple module that demonstrates the phenomenon. The output looks like:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">Msgs sent: 0 Msgs in queue: 0 Binaries of receiver: 0<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">Msgs sent: 1 Msgs in queue: 1 Binaries of receiver: 1<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">Msgs sent: 2 Msgs in queue: 2 Binaries of receiver: 2<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">[...goes well up to 36...]<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">Msgs sent: 36 Msgs in queue: 36 Binaries of receiver: 36<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">[then binary count stays 36, for thousands of messages, and suddenly starts counting again ! ]<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Looks like if there are some magic limits at 36 (sometimes 33), 256, 4781, 12518 and 20255 messages/binaries and so far I was unable to find any logic in which limit takes effect.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I am aware that this feature of process_info is not meant for production use (“can be changed or removed without prior notice.”), but this misleading behavior is maybe worse than not having it.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">May I kindly ask for an explanation of what I observe?<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Thanks!<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span style=font-size:10.0pt;font-family:"Arial","sans-serif";color:black>Andras G. Bekes<br /></span><o:p></o:p></p><p class="MsoNormal">----------------------------------------------------------------------------------<o:p></o:p></p>
<p class="MsoNormal">My test module:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">-module(msgq_len_bin_test).<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">-export([test_sleeper/0,test_receiver/0]).<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">test_sleeper()-><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">   io:format("Testing sleeper...\n",[]),<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">   PID = spawn_link(fun sleeper/0),<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">   sender(PID,0,10000,x). % no reason to test further, binary count never goes above 36<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">test_receiver()-><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">   io:format("Testing receiver...\n",[]),<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">   PID = spawn_link(fun receiver/0),<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">   sender(PID,0,100000,x). % worth testing big numbers<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">sleeper()->timer:sleep(100000000).<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">receiver()-><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">   timer:sleep(10),<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">   receive _ -> ok end,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">   receiver().<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">sender(_,N,N,_)-> io:format("Sent ~p messages.",[N]);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">sender(PID,N,Max,LastBinLen)-><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">   [{message_queue_len,MsgQLen}, {binary,BinaryInfoList}] =<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">      erlang:process_info(PID,[message_queue_len,binary]),<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">   BinLen = length(BinaryInfoList),<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">   case BinLen of<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">      LastBinLen -> io:format(".",[]);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">      _ -> io:format("Msgs sent: ~p Msgs in queue: ~p Binaries of receiver: ~p \n",[N,MsgQLen,BinLen])<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">   end,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">   RefcBinary = binary:copy(<<N:32>>,1000),<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">   PID ! RefcBinary,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">   sender(PID,N+1,Max,BinLen).<o:p></o:p></span></p>
<p class="MsoNormal"><span style=font-size:7.5pt;font-family:"Arial","sans-serif";color:black>   </span><o:p></o:p></p>
</div>
<BR /><BR />
<HR id=HR1 />
<BR /><BR />
<P></P>
<P></P>
<P></P>
<P></P></P></BODY>
</HTML>