Wednesday January 12, 2011

[Time] NameMessage
[00:44] zchrish If I have a PUBSUB system with 3 subscribers that can handle data rates of 10,000 - 20,000 - 30,000 messages per second respectively, how many messages would arrive at the fastest subscriber after 10 seconds? I am asking theoretically of course. This is my next test.
[01:10] zchrish The result of the above test suggests that PUBSUB sets the transmisstion rate to the slowest subscriber; is that correct? If so, that could be a problem for my application if I encounter someone with a dialup or with a zombie subscriber. Is there anything that can be done in these cases?
[01:11] zchrish <test1> was all localhost and the aggregate PUB->FORWARDER->SUB was 72,350 messages per second.
[01:12] zchrish <test2> added an additional endpoint subscriber but across the internet and the aggregate reduced to 27,000 messages per second.
[01:13] zchrish <test2> showed both localhost and remote subscribers completed at the same time
[01:14] zchrish <test2> also had a couple of occurrances in which the transmission stalled for some seconds which I cannot account since other activities on my system appeared normal.
[01:17] zchrish <test2> both local and remote had correct diffs to the original !
[01:22] zchrish The result of <test2> seems to indicate that PUBSUB uses a global queue for its messaging system which is probably obvious but I haven't dug into the source code to find out. I wanted to be a user for awhile to see how it operates first.
[01:23] zchrish Seems like one item on the to-do list is to implement per-subscription queueing to improve transmission rates for faster channels. I am too naive to know what additional complexity that requires...
[02:19] potatodemon Howdy Y'all! Can zeromq listen as a normal TCP socket? I have a lot of clients using normal sockets that I want to all connect to the zeromq server at once. Is that something zeromq is good for ?
[03:08] potatodemon It looks like zeromq does not do normal sockets, is that correct ?
[03:08] jugg
[03:27] potatodemon How many queues can I have with 0mq on a machine with a gig of ram?
[04:06] cremes potatodemon: you could probably figure this out on your own by writing a little app that spawns a bunch of sockets
[04:07] cremes make sure you bump up the number of file descriptors available to your process or it will run out pretty quickly
[04:07] cremes also, i think 0mq defaults to 512 max sockets; you need to change that in the source and recompile
[04:29] benoitc hi all
[04:29] benoitc how stable is erlzmq actually ?
[07:23] sustrik snidely: what libraries?
[07:43] potatodemon Hey Y'all anyone in here know a lot about the Python ZMQ lib ?
[07:44] guido_g dont't as meta-questions, just ask the question and wait
[07:46] potatodemon I just wanted to know if anyone has used the Python ZMQ lib with the Python gevents lib.
[07:48] potatodemon I am trying to write a simple normal bsd sockets to 0mq data proxy
[07:49] guido_g s0undt3ch had something like this yesterday
[07:49] potatodemon Or find a good, fast one
[07:49] guido_g you could do it w/ pyzmq.eventloop
[07:51] potatodemon Will that give me a async socket server ?
[07:51] potatodemon I think it does. Do you know any examples -- this is new to me.
[07:52] guido_g
[07:59] potatodemon Cool, a good place to start. Thanks
[08:22] CIA-21 zeromq2: 03Neale Ferguson 07master * r7051387 10/ (AUTHORS src/ src/clock.cpp):
[08:22] CIA-21 zeromq2: Support dynamic generation of C preprocessor definitions for PGM rather than hardcoding them.
[08:22] CIA-21 zeromq2: Signed-off-by: Neale Ferguson <> -
[08:41] codebeaker 2
[08:45] codebeaker sorry, morning all - someone was kind enough to help me out last night, but had another quick query - with the code from - there are missing build instructions, specifically for using that in my own project which is built iwith cmake
[08:47] sustrik welll, with cmake you are probably on your own, it's not part of the official project and there's little knowledge of it; you can possibly to address patrick cheng directly...
[08:57] codebeaker ahh, thanks sustrik -
[08:58] codebeaker I *think* to be honest, this is something that would be easier if I knew about CMake - I want my build to automatically compile the ZMQ target, but I cna't work out how - and Patrick didn't write any docs :)
[08:59] benoitc erlzmq version using rebar :
[08:59] benoitc if it helps someone
[08:59] benoitc how do you guys handle persistence with zmq ?
[09:03] codebeaker benoitc: as far as I understand, that's completely up to tiy
[09:03] codebeaker to you* since I believe you can guarantee that if the message is not sent, then it's not sent - and you should persist it
[09:06] benoitc mmm right
[09:06] codebeaker ^^ :) HTH
[09:07] benoitc want ot use the possibility of zmq to load balance messages with push/pull instead of simply using redis and jhandle manually suscription
[09:07] benoitc +s
[09:07] benoitc maybe i will just use both
[09:42] si14 hi all. Is anybody there?
[09:49] si14 I'm trying to make a zeromq, but I've got a lot of errors like this
[09:49] si14 /usr/include/c++/4.4/bits/stl_vector.h:434: error: ‘__gnu_cxx::__normal_iterator<typename std::_Vector_base<_Tp, _Alloc>::_Tp_alloc_type::const_pointer, std::vector<_Tp, _Alloc> > std::vector<_Tp, _Alloc>::begin()’ cannot be overloaded
[09:50] si14 in fact it's something like this (it's not my log, but this one is very similar to mine):
[09:54] si14 ah, sorry, I've found the solution here:
[09:56] sustrik sil4: if you find the website not addressing this problem, feel free to adjust it
[09:56] sustrik it's a wiki
[12:37] s0undt3ch guido_g: remeber my problem fom yesterday? here's a sucessfull attempt with zmq.eventloop using 2.1.0, 2.0.10 does not have zmq.devices, so I couldn't test it ->
[12:37] s0undt3ch guido_g: now I have to narrow down what went wrong on my previous attemps using gobject and eventlet io loops
[13:22] s0undt3ch zchrish: you confirmed that the pub/sub io is as slow as the slowest client right?
[13:28] zchrish sOundt3ch: No, according to sustrik this is not the case. The cause of throughput drop is by the use of unicast and the throughput drops linearly with the number of subscribers.
[13:28] s0undt3ch zchrish: pub sub uses unicast?
[13:30] s0undt3ch zchrish: or you were using unicast on you pub/sub sockets?
[13:30] s0undt3ch ah, tcp is unicast
[13:31] zchrish sOundt3ch: My testing was using tcp. There exists pgm/epgm but I have no experience with it.
[13:32] s0undt3ch zchrish: for now I'm using local unix sockets, but I might need to use tcp at a latter stage...
[13:33] s0undt3ch zchrish: anyway, Thanks, was just wondering...
[13:35] zchrish sOundt3ch: My application is designed to be transported through the internet so I am concerned with latency and throughput issues. Still don't have enough experience with 0mq to know how robust it will be to this but I like what I see so far.
[15:47] yawn any advice on jzmq error handling?
[15:47] yawn it tends to die from assertions and being jni i have no obvious way to handle those
[16:15] efhache hi everybody... I need some help with a cross-compiled(arm) library under linux 2.4
[16:16] efhache I've previously compiled the library, codded and work fine under a linux 2.6 but now with a kernell 2.4, I obtain an error as Function not implemented epoll_fd != -1 (epoll.cpp:40) Aborted
[16:16] efhache May be is it possible to configure and recompile the library with an other sort of poolling?
[16:19] mikko yawn: what sort of assertions?
[16:19] mikko and which version of libzmq?
[16:19] efhache zmq 2.0.7
[16:19] yawn mikko: different assertions really. i have not yet collected all of them, last one was Assertion failed: (s), function get_socket, file Socket.cpp, line 467.
[16:20] mikko efhache: can you test with 2.1.0 ?
[16:20] yawn mikko: version is 2.0.10 from brew
[16:20] mikko i remember there is an issue with using epoll on linux even if it's not available
[16:20] yawn mikko: env is mac os x, snow leopard
[16:20] mikko yawn: can you test with 2.1.0 ?
[16:20] mikko 2.1.0 is where active development happens currently
[16:21] mikko so it would be helpful to see if those have been sorted out already
[16:21] efhache miko : not really All the code developped was based on an zmq 2.0.7 version
[16:21] yawn mikko: sure. but the large variety of errors makes me a bit nervous since there really seems to be no way of "catching" those errors. the jvm simply dies as soon as something crashes in the zmq api.
[16:21] yawn mikko: that's why i'm asking about error handling
[16:22] mikko yawn: yes, that's what assertion causes. large chunk of those have been sorted out and we are fixing them as we bump into new ones
[16:22] mikko efhache: i can check this evening as you should probably use poll rather than epoll with 2.4
[16:23] yawn mikko: ok. i have not much experience with jni at all but is there some kind of mechanism that would prevent the jvm from dying?
[16:23] efhache ok I'll back to you tomorow
[16:23] yawn mikko: or is there a flag that changes the assertion behaviour in zmq?
[16:23] yawn mikko: compile-time flag
[16:23] mikko efhache: sure
[16:23] mikko yawn: yes, but those are not properly handled in that case
[16:24] efhache mikko: I'll search again this evening, thw
[16:24] mikko yawn: you can specify -DNDEBUG iirc
[16:24] yawn ok
[16:25] mikko yawn: it would be helpful if you can give 2.1.0 a spin
[16:25] yawn mikko: i'll try to update zmq and compiling with DNDBUG (or whatever the flags name is).
[16:25] mikko yawn: try without the flag first
[16:25] mikko yawn: as i said 2.1.0 fixes a lot of the assertions
[16:25] mikko yawn: and if you run into assertions in normal usage we would like to sort those out as well
[16:26] yawn mikko: i think that most of the problems occur when inproc sockets with multipart messages terminate before the message is complete
[16:26] mikko yawn: do you code C ?
[16:26] mikko C test case would be a huge help (java should be ok as wlel but takes a bit longer to process)
[16:27] yawn mikko: no, it's a java project
[16:27] mikko if you can wait a couple of hours for me to get home i can test this on 2.1.0
[16:27] mikko i dont have java bindings running but shouldnt take long to get them
[16:28] mikko and as it's JNI java test case should be fairly valid as well
[16:28] yawn mikko: test data is a bit problematic since it's driven by real world data. plus the server that interfaces with zmq is evented - so i usually have no idea at all what exactly caused the assertion.
[16:28] mikko ok
[16:28] yawn real world data = totally volatile stuff
[16:28] mikko you can have the process to core dump on assertion
[16:28] mikko and run it in debugger
[16:28] mikko but i would recommend testing with 2.1.0 as the first step
[16:28] yawn i'll do that first
[16:29] yawn when it's still dying i'll try to send you a dump
[16:34] yawn mikko: damn, 2.1.0 is not yet on brew ... :-)
[16:35] mikko brew is something like macports?
[16:56] zchrish In the PUBSUB pattern, is there a way for the publisher to know something about the subscriber set?
[16:57] zchrish like subscriber IPs.
[16:59] Vince my wrapper has been throwing this message at me today "Operation cannot be accomplished in current state" anyone seen that before? This happens with zmq_recv()
[16:59] zchrish If not, I suppose it could be easy enough to broadcast a call-in message which causes the subscriber set to respond.
[17:00] Vince Seems the actual point which throws this error is here:
[17:00] cremes zchrish: no, it's not possible because that kind of information doesn't fit into the pub/sub pattern
[17:00] Vince // In blocking scenario, commands are processed over and over again until // we are able to fetch a message. while (rc != 0) { if (errno != EAGAIN)
[17:00] cremes zchrish: use a separate pair of sockets to share that information
[17:00] Vince whats a blocking scenario? How do I over come it?
[17:00] cremes Vince__: that is happening with a req/rep pair, yes?
[17:00] zchrish OK; thanks.
[17:01] Vince yes
[17:01] cremes Vince__: you need to call send/recv/send/recv in that pattern for each one; you must be trying to call send/send or recv/recv somewhere
[17:01] cremes which violates the request/reply state machine
[17:02] potatodemon Are pyzmq zmq socket sends non-bocking ?
[17:02] Vince recv/recv on a server demo in a loop........ I guess that was wrong then
[17:02] cremes Vince__: yep, that's wrong
[17:02] cremes potatodemon: i doubt sends are nonblocking by default; there is likely a flag you can pass to make it so
[17:02] cremes otherwise it blocks by default
[17:03] Vince Seems like I need to rethink the design then
[17:03] Vince the server won't be sending anything usually though so now I'm confused...
[17:03] cremes Vince__: tell us what you are trying to do and we can probably make suggestions
[17:05] Vince I wrote a wrapper for a basic language that not many people use (blitz) it needed safe types so I wrote an addition to the ZMQ API to use safe types as well. Everything seems to be fine except for this issue. I created a server in basic that right now has zmq_recv() running in a while loop. Obviously thats not right.
[17:05] cremes Vince__: explain what the client is supposed to do and what the server is supposed to do
[17:06] Vince server recieves messages from client and sends it to other clients
[17:06] Vince pretty simple
[17:06] cremes and what does the client do?
[17:07] cremes send requests only?
[17:07] Vince client sends messages to the server and recieves messages from the server
[17:07] yawn mikko: yes.
[17:07] cremes ok
[17:08] cremes so which one of these (client or server) is currently sitting in a while loop doing recv?
[17:08] Vince server
[17:09] cremes does that server ever need to respond back to the client, e.g. return a result?
[17:09] Vince I was hoping to just let the server sit there and wait for a connection/message from client
[17:09] cremes ok; so does the server ever need to respond back to its clients?
[17:10] cremes i'm trying to understand the message flow.... it's unclear
[17:10] Vince the server needs to communicate messages from ClientA to B,C,D,E,F etc... the server doesn't need to talk back to the client that connected. All I need to know is if the client connected successfully.
[17:10] cremes ok
[17:11] cremes do clients B,C,D,etc need to respond to A or is the message flow uni-directional?
[17:11] cremes that is, A only ever sends and never receives, B,C,D,etc only recv and never send
[17:11] Vince Easiest example I can think of is a game server where the client moves and the movement is sent to all the other clients
[17:12] cremes ok
[17:12] cremes you should look at the pub/sub sockets; req/rep is the *wrong* pattern
[17:12] Vince hmmm
[17:12] cremes client A would have a PUB socket
[17:12] cremes the server would be a FORWARDER device
[17:13] cremes the clients of the server would all have SUB sockets and would subscribe to the topics they want
[17:13] cremes does that make sense?
[17:13] cremes if not, tell me where it's confusing or wrong
[17:14] Vince I guess I need to make sure I understand what you are saying.
[17:14] cremes ok, i'll break it down a bit more
[17:14] cremes client A *only* sends data and never cares about a response to what it sent
[17:15] Vince is there a simple example anywhere?
[17:15] cremes ...
[17:15] cremes did you read the guide linked off of the website?
[17:15] cremes it covers all of these patterns in detail with code
[17:15] Vince Yes I did actually
[17:15] cremes and the PUB section didn't seem appropriate for some reason?
[17:16] Vince It is probably. I just did the tutorials a few weeks ago.
[17:16] Vince Forwarder seems to be throwing me.
[17:17] Vince I am looking at the guide now.
[17:18] cremes forwarder is a pretty simple device... let me see if i can help clarify its use
[17:18] cremes a forwarder device will have a SUB socket and a PUB socket
[17:18] Vince k
[17:18] cremes both sockets will *bind* to some addresses
[17:19] cremes a publisher (client A) connects to the forwarder and sends its messages there
[17:20] cremes subscribers interested in what client A have to say subscribe to the forwarder without needing to know the address of client A
[17:20] Vince aha! thats what I want indeed
[17:20] cremes now along comes client B who *also* wants to publish data to an unknown number of subscribers
[17:20] cremes it also connects to the forwarder and starts publishing
[17:21] cremes a forwarder is a device for linking up multiple subscribers with multiple publishers
[17:21] cremes does this help?
[17:22] cremes the forwarder can be thought of as a way to get "multicast"/spread delivery via tcp
[17:23] Vince so what happens with the forwarder in terms of the application. Do I not need to actively tell it to recv messages?
[17:23] cremes nope
[17:23] cremes take a look at the code in the repository.... it's super simple
[17:24] cremes it essentially sits in a while loop; every time it receives something it immediately sends it out to all subscribers
[17:24] Vince ah
[17:24] Vince I'm starting to think something like
[17:24] Vince zmq_init() // Socket facing clients zmq_socket() // Socket facing services zmq_bind() zmq_socket() // Start built-in device zmq_device()
[17:40] Vince cremes how can I determine if a subscriber connects to the published socket from the server application?
[18:15] cremes Vince__: that information is not exposed by the 0mq library; you would need a separate pair of sockets to transmit that info
[18:15] cremes at the application level
[18:19] Vince thanks for all your help cremes!
[18:19] cremes Vince__: you're welcome
[18:19] Vince pub/sub is certainly what I was looking for
[19:24] mikko good evening
[20:26] mikko sustrik: there?
[20:37] sustrik mikko: hi
[20:39] mikko sustrik: im adding some static analysis tools to builds
[20:39] mikko they might produce some false positives but i guess it's ok
[20:39] mikko
[20:45] sustrik mikko: nice
[20:45] sustrik let me check the report
[20:47] sustrik mikko: that's the current master?
[20:48] sustrik it looks like there's a bug in cppcheck :)
[20:50] sustrik struct x {}; results in "Redundant code: Found a statement that begins with numeric constant"
[20:51] mikko i could scale down the volume
[20:51] mikko to more critical errors
[20:51] sustrik no need
[20:51] mikko i was thinking about adding a check for trailing whitespace as well
[20:51] sustrik why not
[20:52] sustrik i should maybe report the problem to cppcheck devs...
[20:53] mikko yes, they are on github as well
[20:56] sustrik hm, github? brief search seems to point me to sourceforge
[20:59] mikko
[20:59] mikko at least this is where i cloned it from
[21:00] sustrik probably a mirror
[21:00] sustrik the project itselft seems to live at sourceforge
[21:10] sustrik ok, i've posted a comment on their forum
[21:32] danyamins hi
[21:32] danyamins does anyone here have ideas about using pyzmq to make an asychronous driver for mongodb?
[21:34] guido_g mongodb doesn't speak ømq
[21:34] guido_g so it would be more a proxy then a driver
[21:34] danyamins well
[21:34] danyamins when you say it doesnt speak 0zm, what do you mean?
[21:35] danyamins (sorry for the naive question)
[21:35] guido_g mongodb doesn't understand ømq messages
[21:36] danyamins you mean, there's something about he packing of the bits ?
[21:36] danyamins you have to have it in aparticular form, the things you send over the sockets?
[21:36] guido_g *sigh* yes
[21:37] danyamins how so?
[21:37] danyamins where is that documented?
[21:37] danyamins I mean, undestand that the mongo stuff has to be in a particular form
[21:37] danyamins I've already written a mongodb asynchronous driver
[21:37] danyamins (I was hoping to replace the regular sockets in it with zmq sockets)
[21:38] danyamins (and replace the tornado ioloop i use with the zmq ioloop)
[21:38] mikko danyamins: zeromq frames the messages before sending them over wire
[21:38] danyamins ah
[21:45] danyamins so what is the proper solution?
[21:45] danyamins do I have any options?
[21:45] danyamins that are good?
[21:47] yrashk is there any common reason why this might happen?
[21:52] benoitc I started a zeromq endpoint for couchdb
[21:54] danyamins could that help with the mongodb project?
[21:55] benoitc no
[21:55] danyamins ok sorry
[22:04] mikko danyamins: you can't easily have zmq to communicate with mongo
[22:04] mikko danyamins: you would need to write a proxy that takes zeromq messages and converts them to something that mongo understands
[22:04] mikko so you are effectively back to square one
[22:05] mikko benoitc: i think i've seen this before
[22:06] mikko or something similar
[22:27] mikko sustrik:
[22:27] mikko duplicate code checker as well
[22:27] mikko now time to sleep
[22:27] mikko g'night
[23:03] Seta00 how do I check if the other endpoint is running?
[23:05] Seta00 (on a SUB socket)
[23:05] Seta00 if that matters :P
[23:06] neopallium Seta00: you can't with just a SUB socket.
[23:06] Seta00 neopallium, what are my options?
[23:06] neopallium you can create a REQ socket and send a request to the publisher to see if they are running, or just wait for a message on the SUB socket.
[23:07] Seta00 the problem with just waiting is that I can't notify users that the server is not running
[23:07] neopallium the publisher can bind a REP socket, which the subscribers connect with a REQ socket to to ask if they are running.
[23:07] Seta00 so the REQ socket won't wait for the endpoint to come online like a SUB socket?
[23:08] neopallium no, you would have to add some timeout when you send the request over the REQ socket.
[23:08] Seta00 hmm, I wonder how I didn't notice that
[23:09] Seta00 thank you neopallium
[23:09] neopallium np
[23:10] neopallium I just wished 0mq provided a way to register to receive events from the sockets (i.e. like connect/disconnect notices).
[23:11] Seta00 that would be nice :)