Zack Allen [Fri, 20 Dec 2013 21:28:21 +0000 (16:28 -0500)]
Updated global PDNS log table with DROP and PASS values to return on the stack for passthrough. This allows for users issue a dontanswer type to drop and not process any unwanted queries. Updated the example script to reflect changes. Updated the pdns.xml to reflect changes
bert hubert [Mon, 16 Dec 2013 12:19:52 +0000 (13:19 +0100)]
ok, so it turns out that poll, select and a few other system calls can return EINTR when we receive and interrupt, and we need to manually restart. man 7 signal makes for good reading on this case, as does http://blog.reverberate.org/2011/04/eintr-and-pc-loser-ing-is-better-case.html
Mark Zealey [Sat, 14 Dec 2013 21:47:15 +0000 (23:47 +0200)]
Remove AnswerData.created time field as it doesn't seem to be referenced anywhere and the time() call seems to take about 1-2% of process time under high load.
Mark Zealey [Sat, 14 Dec 2013 21:38:09 +0000 (23:38 +0200)]
Remove AnswerData.created time field as it doesn't seem to be referenced anywhere and the time() call seems to take about 1-2% of process time under high load.
Mark Zealey [Fri, 13 Dec 2013 20:39:47 +0000 (22:39 +0200)]
On testing with large numbers of unknown domains the send-root-referral
argument query amounted to quite a high proportion of CPU time. This will cache
it to reduce this overhead as is already done with a number of variables.
Mark Zealey [Mon, 2 Dec 2013 09:12:46 +0000 (11:12 +0200)]
fixes PowerDNS/pdns#666
SO_REUSEPORT is available on various bsd operating systems as standard, and also as a linux kernel patch from Google. It allows
1) Running 2 powerdns processes concurrently so that you can restart powerdns without loosing any packets
2) (the main purpose for my writing this patch) On linux with a patched kernel removes contention from many threads using a socket. In my tests this improves performance with a packet cache from 300kqps to 1mqps
If the SO_REUSEPORT call is available and the reuseport config option set to yes, the attached patch causes each receiver thread to open a new socket for connections which allows each thread (on linux) to operate at full speed rather than waiting on a slow socket. It should fail nicely ie if the call is not available at either compile time or run time it will just use the initially created socket.
Was merged in to linux 3.9 series - see https://lwn.net/Articles/542629/ for more information
Mark Zealey [Mon, 2 Dec 2013 09:19:24 +0000 (11:19 +0200)]
fixes PowerDNS/pdns#692
For the second time when writing a backend I forgot that an ANY query needs to return any SOA data as well. This is because we store our SOA's separately from our other DNS data in order to optimize zone lookups. According to Habbie MyDNS backend has the same bug. The attached patch basically forces an SOA to be included which is actually much more optimal than anything I can do in my backends as I don't have easy access to the knowledge of:
* sd data structure;
* is this query also an SOA
meaning that if I answer it in the backend I have to do a number of additional lookups for information that is already available in the PacketHandler. Additionally, I notice that you are basically doing all the SOA setup anyway if there is anything looking like an SOA entry. So, all this patch does is strip out any SOA entries and then insert one if there should be. This seems to me to both potentially simplify backend code and fix up any user errors more accurately than the current code does.
Mark Zealey [Mon, 2 Dec 2013 09:12:46 +0000 (11:12 +0200)]
fixes PowerDNS/pdns#666
SO_REUSEPORT is available on various bsd operating systems as standard, and also as a linux kernel patch from Google. It allows
1) Running 2 powerdns processes concurrently so that you can restart powerdns without loosing any packets
2) (the main purpose for my writing this patch) On linux with a patched kernel removes contention from many threads using a socket. In my tests this improves performance with a packet cache from 300kqps to 1mqps
If the SO_REUSEPORT call is available, the attached patch causes each receiver thread to open a new socket for connections which allows each thread (on linux) to operate at full speed rather than waiting on a slow socket. It should fail nicely ie if the call is not available at either compile time or run time it will just use the initially created socket.
Was merged in to linux 3.9 series - see https://lwn.net/Articles/542629/ for more information
Mark Zealey [Mon, 2 Dec 2013 09:07:00 +0000 (11:07 +0200)]
fixes PowerDNS/pdns/#661
I was doing some performance testing on our 32-way servers and discovered that in the simple case where the test program returns the data straight away, about 80% of the time was being spent in the kernel in a spinlock. I've been debugging this looking at the coprocess code and discovered that this is due to the following line in coprocess.cc:
setbuf(d_fp,0); // no buffering please, confuses select
If this is removed, performance in my particular test case goes from 2000qps with powerdns running at about 2000% cpu to 10000qps with powerdns using about 300% cpu.
Obviously the comment implies that this is not a permanent solution, I guess if the timeout is specified as 0 then the select code won't be executed and so you can disable the setbuf easily enough. However perhaps if the timeout is wanted you could set an alarm() rather than using select?
Mark Zealey [Mon, 2 Dec 2013 08:57:42 +0000 (10:57 +0200)]
fixes PowerDNS/pdns#650
The attached patch changes the distributor code in the following ways:
1) Remove (as far as i can see) unused functions which allow for the fetching of the answer from an answers queue. I struggle to understand why this would ever be useful compared to having a callback; it also reduces code complexity and removes some locks. Also allows (2):
2) Split into 3 classes - the new ones being SingleThreadDistributor and MultiThreadDistributor - removes some of the conditional statements. It also means that in distributor-threads=1 mode, NO additional distributor threads are forked (unlike the existing code), and the class will also use less memory and generally be more efficient.
This has been tested in that the pdns server starts up and answers questions correctly in both modes, it's more of an RFC attempt to clean up the code a bit.