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>
<br>I have a NIF thread that listens on kqueue/epoll and communicates with a gen_server. Sockets are resources. 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>
<br>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>