This is very cool! mod_status assumes that sysconf() exists, but do we need to do a config check on the params we use in these patches? We look OK on Linux, FreeBSD and OSX...
I'm +1 on folding into trunk. On May 13, 2014, at 7:55 PM, Lu, Yingqi <yingqi...@intel.com> wrote: > Dear All, > > During the last couple weeks, I spent some time extending the original two > patches from prefork MPM only to all three Linux MPMs (prefork, worker and > event). Attached is the latest version of the two patches. Bugzilla database > has also been updated already. The ID for the two patches are #55897 and > #56279. Please refer to messages below for details on both of the patches. > > Quick test result on modern dual socket Intel platform (Linux Kernel 3.13.9) > SO_REUSEPORT patch (bugzilla #55897) > 1. Prefork MPM: 1 listen statement: 2.16X throughput improvement; 2 > listen statements: 2.33X throughput improvement > 2. Worker MPM: 1 listen statement: 10% throughput improvement; 2 listen > statements: 35% throughput improvement > 3. Event MPM: 1 listen statement: 13% throughput improvement; 2 listen > statements: throughput parity, but 62% response time reduction (with patch, > 38% response time as original SW) > > Bucket patch (bugzilla #56279, only impact multiple listen statement case) > 1. Prefork MPM: 2 listen statements: 42% throughput improvement > 2. Worker MPM: 2 listen statements: 7% throughput improvement > > In all the above testing cases, significant response time reductions are > observed, even with throughput improvements. > > Please let me know your feedback and comments. > > Thanks, > Yingqi > Software and workloads used in performance tests may have been optimized for > performance only on Intel microprocessors. Performance tests, such as SYSmark > and MobileMark, are measured using specific computer systems, components, > software, operations and functions. Any change to any of those factors may > cause the results to vary. You should consult other information and > performance tests to assist you in fully evaluating your contemplated > purchases, including the performance of that product when combined with other > products. > > From: Lu, Yingqi [mailto:yingqi...@intel.com] > Sent: Monday, March 17, 2014 1:41 PM > To: dev@httpd.apache.org > Subject: RE: FW: [PATCH ASF bugzilla# 55897]prefork_mpm patch with > SO_REUSEPORT support > > Dear all, > > Based on the feedback we received, we modified this patch. Here is the most > recent version. We also modified the Bugzilla database(Bugzilla# 55897 for > SO_REUSEPORT patch; Bugzilla# 56279 for bucket patch). > > Below are the changes we made into this new version: > > According to Yann Ylavic and other people’s comments, we separate the > original patch between with and without SO_REUSEPORT into two separated > patches. The SO_REUSEPORT patch does not change the original listen sockets, > it just duplicate the original one into multiple ones. Since the listen > sockets are identical, there is no need to change the idle_server_maintenance > function. The bucket patch (without SO_REUSEPORT), on the other hand, it > breaks down the original listen record (if there are multiple listen socks) > to multiple listen record linked lists. In this case, idle_server_maintenance > is implemented at bucket level to address the situation that imbalanced > traffic occurs among different listen sockets/children buckets. In the bucket > patch, the polling in the child process is removed since each child only > listens to 1 sock. > > According to Arkadiusz Miskiewicz’s comment, we make the “detection of > SO_REUSEPORT” at run time. > > According to Jeff Trawick’s comments, > 1. We generate the patches against the httpd trunk. > 2. We tested the current patches and they do not impact event and worker > mpms. If current patches can be accepted, we would be happy to extend them to > other Linux based mpms. There are not much code changes, but require some > time to setup the workload to test. > 3. We removed unnecessary comments and changed APLOGNO(). We also changed > some of the parameter/variable/function names to better represent their > meanings. > 4. There should be no build-in limitations for SO_REUSEPORT patch. For bucket > patch, the only thing is the number of children bucket only scales to > MAX_SPAWN_RATE. If there are more than 32 (current default MAX_SPQN_RATE) > listen statements specified in the httpd.conf, the number of buckets will be > fixed to 32. The reason for this is because that we implement the > idle_server_maintenance at bucket level, each bucket’s own max_spawn_rate is > set to MAX_SPAWN_RATE/num_buckets. > > Again, thanks very much for all the comments and feedback. Please let us know > if there are more changes we need to complete to make them accepted. > > Thanks, > Yingqi Lu > > > > From: Lu, Yingqi > Sent: Tuesday, March 04, 2014 10:43 AM > To: dev@httpd.apache.org > Subject: RE: FW: [PATCH ASF bugzilla# 55897]prefork_mpm patch with > SO_REUSEPORT support > > Hi Jeff, > > Thanks very much for your time reviewing the patch! We will modify the patch > according to your comments and repost it here. > > Thanks, > Yingqi > > From: Jeff Trawick [mailto:traw...@gmail.com] > Sent: Tuesday, March 04, 2014 10:08 AM > To: Apache HTTP Server Development List > Subject: Re: FW: [PATCH ASF bugzilla# 55897]prefork_mpm patch with > SO_REUSEPORT support > > On Tue, Mar 4, 2014 at 10:35 AM, Lu, Yingqi <yingqi...@intel.com> wrote: > Hi All, > > I just want to ping again on this patch to gather your feedback and comments. > Please refer to the messages below for patch details. > > If you need any additional information/supporting data, please let us know as > well. > > Yeah, it has been on my todo list, but I don't have time to give an in depth > review at the moment. Here are a few questions/comments. (And you'll have > to deal with the fact that it is unnecessarily tedious for me to evaluate > higher-level considerations if there are a lot of distractions, such as the > code comments below ;) But others are of course free to chime in.) > > The patch should be against httpd trunk. It probably won't take much time > for you to create that patch and confirm basic operation. > > What is the impact to other MPMs, even if they shouldn't use or don't have > the necessary code to use SO_REUSEPORT at this time? > > Have you tried the event MPM? > > Is there a way for the admin to choose this behavior? Most won't care, but > everyone's behavior is changed AFAICT. > > Are there built-in limitations in this patch that we should be aware of? > E.g., the free slot/spawn rate changes suggest to me that there can't be more > than 1025 children??? > > We should assume for now that there's no reason this couldn't be committed to > trunk after review/rework, so make sure it is as close as you can get it to > what you think is the final form. > > For the configure-time check for 3.9 kernel: I think we'd also use > AC_TRY_COMPILE at configure time to confirm that the SO_REUSEPORT definition > is available, and not enable it if the system includes doesn't define it. > (Does that cause a problem for any significant number of people?) > > Don't mention the patch in the patch ;) (e.g., "This function is added for > the patch.") > > Incomplete comments on style/syntax issues: > > * mixing declarations and statements (e.g., "duplr->next = 0; apr_socket_t > *temps;") isn't supported by all compilers and is distracting when reviewing > * suitable identifier names (e.g., fix global variable "flag" and whatever > else isn't appropriate; "ap_post_config_listeners" should be renamed to > indicate what it does > * APLOGNO(99999) and comments about fixing it: Instead put "APLOGNO()" and > don't add reminders in comments > * this doesn't seem portable: "int free_slots[MAX_SPAWN_RATE/num_buckets];" > and so on > > > Thanks, > Yingqi > > > From: Lu, Yingqi > Sent: Friday, January 24, 2014 3:26 PM > To: dev@httpd.apache.org > Subject: [PATCH ASF bugzilla# 55897]prefork_mpm patch with SO_REUSEPORT > support > > Dear All, > > Our analysis of Apache httpd 2.4.7 prefork mpm, on 32 and 64 thread Intel > Xeon 2600 series systems, using an open source three tier social networking > web server workload, revealed performance scaling issues. In current > software single listen statement (listen 80) provides better scalability due > to un-serialized accept. However, when system is under very high load, this > can lead to big number of child processes stuck in D state. On the other > hand, the serialized accept approach cannot scale with the high load either. > In our analysis, a 32-thread system, with 2 listen statements specified, > could scale to just 70% utilization, and a 64-thread system, with signal > listen statement specified (listen 80, 4 network interfaces), could scale to > only 60% utilization. > > Based on those findings, we created a prototype patch for prefork mpm which > extends performance and thread utilization. In Linux kernel newer than 3.9, > SO_REUSEPORT is enabled. This feature allows multiple sockets listen to the > same IP:port and automatically round robins connections. We use this feature > to create multiple duplicated listener records of the original one and > partition the child processes into buckets. Each bucket listens to 1 IP:port. > In case of old kernel which does not have the SO_REUSEPORT enabled, we > modified the "multiple listen statement case" by creating 1 listen record for > each listen statement and partitioning the child processes into different > buckets. Each bucket listens to 1 IP:port. > > Quick tests of the patch, running the same workload, demonstrated a 22% > throughput increase with 32-threads system and 2 listen statements (Linux > kernel 3.10.4). With the older kernel (Linux Kernel 3.8.8, without > SO_REUSEPORT), 10% performance gain was measured. With single listen > statement (listen 80) configuration, we observed over 2X performance > improvements on modern dual socket Intel platforms (Linux Kernel 3.10.4). We > also observed big reduction in response time, in addition to the throughput > improvement gained in our tests 1. > > Following the feedback from the bugzilla website where we originally > submitted the patch, we removed the dependency of APR change to simplify the > patch testing process. Thanks Jeff Trawick for his good suggestion! We are > also actively working on extending the patch to worker and event MPMs, as a > next step. Meanwhile, we would like to gather comments from all of you on the > current prefork patch. Please take some time test it and let us know how it > works in your environment. > > This is our first patch to the Apache community. Please help us review it and > let us know if there is anything we might revise to improve it. Your feedback > is very much appreciated. > > Configuration: > <IfModule prefork.c> > ListenBacklog 105384 > ServerLimit 105000 > MaxClients 1024 > MaxRequestsPerChild 0 > StartServers 64 > MinSpareServers 8 > MaxSpareServers 16 > </IfModule> > > 1. Software and workloads used in performance tests may have been optimized > for performance only on Intel microprocessors. Performance tests, such as > SYSmark and MobileMark, are measured using specific computer systems, > components, software, operations and functions. Any change to any of those > factors may cause the results to vary. You should consult other information > and performance tests to assist you in fully evaluating your contemplated > purchases, including the performance of that product when combined with other > products. > > Thanks, > Yingqi > > > > -- > Born in Roswell... married an alien... > http://emptyhammock.com/ > http://edjective.org/ > > > > > -- > Born in Roswell... married an alien... > http://emptyhammock.com/ > http://edjective.org/ > > <httpd_trunk_so_reuseport.patch><httpd_trunk_bucket.patch>