<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Hi Sergej,<div><br></div><div><br><div><div>On Dec 15, 2011, at 8:55 AM, Rapsey wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">My streaming server is in Erlang and uses this approach. Though a linked in driver is not a good idea. I started with a linked in driver but it was pretty much impossible to get it really stable. With NIFs you can use resources for sockets and stream buffers. They work beautifully.<br></blockquote><div><br></div>Very interesting approcah.</div><div><br><blockquote type="cite">I have a NIF thread that listens on kqueue/epoll and communicates with a gen_server. Sockets are resources.</blockquote><div><br></div>1 thread NIF per core?</div><div><br><blockquote type="cite"> Communication from NIFs to gen_server is simple since enif_send exists, communication from gen_server to the NIF thread is done by pipes (global library read pipe and write pipe).<br></blockquote><div><br></div>Could you please elaborae further on how communication is made from Erlang to NIF (the read/write pipe)?</div><div><br></div><div><br></div><div><div><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; "><div>Regards,</div><div>Zabrane</div><div><br></div></span></div><div><br class="webkit-block-placeholder"></div><blockquote type="cite">The Erlang process that is responsible for sending data to the sockets holds a resource to the stream buffer and a list of socket resources. So the actual loop that sends the data is in Erlang and it calls a NIF with buffer and socket resource on every iteration.<br>
<br><br>Sergej<br><br><div class="gmail_quote">On Wed, Dec 14, 2011 at 11:48 PM, Max Lapshin <span dir="ltr"><<a href="mailto:max.lapshin@gmail.com">max.lapshin@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
I'm sending live stream to 4000+ users.<br>
<br>
Stream is saved in memory (in shared ETS table, in binaries) in chunks<br>
500 KBytes each.<br>
<br>
Client comes and asks for next chunk.<br>
<br>
If I write server in C (or with linked-in driver), I whould just<br>
manage common shared circular buffer from which I will send data and<br>
remember<br>
client position in this buffer. If client is too slow to read from<br>
this buffer, it is disconnected and forgotten.<br>
<br>
Such approach give ability to save memory and not to copy it in<br>
buffers and driver queues.<br>
<br>
Is it possible to have something like this in erlang?<br>
<br>
Currently, I've got limits around 3 GBit/s from one erlang node on<br>
loopback interface and I want to raise this limit.<br>
When traffic comes to this limit, memory begins very fast growing and<br>
when it reaches limits of RAM, massive disconnects happen.<br>
This is why I think, that I should save memory first without trying to<br>
write linked-in tcp driver =)<br>
_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
</blockquote></div><br>
_______________________________________________<br>erlang-questions mailing list<br><a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>http://erlang.org/mailman/listinfo/erlang-questions<br></blockquote></div><br><div>
<span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; "><div><br></div></span></div></div></body></html>