Hi Mingli, Thanks for your suggestion.
Nginx-Clojure is quite different from uwsgi when supports JVM. Nginx-Clojure make JVM embed into Nginx worker process. JVM and Nginx worker have the same memory process space. Nginx-Clojure heavy uses pointer operation just like C to handle memory with Nginx worker. If I'm not wrong, uwsgi create every process for every request, or shared JVM processes between request? When using Nginx-Clojure there's no IPC cost even no thread switch cost if jvm_workers = 0 which is default. So it's why Nginx-Clojure is so fast! On Wednesday, January 15, 2014 3:07:13 AM UTC+8, Mingli Yuan wrote: > > Hi, Xfeep, > > Thanks for your contribution, and the project looks interesting. > > For me, the idea of driving ring webapp behind nginx is not new. > We use uwsgi to drive our ring app behind nginx in our production. > uwsgi support JVM and ring for almost one year, and I think the code is > relative stable right now. > > - it support a native protocol between nginx and uwsgi which is more > efficient than http > - it support unix socket > - and a rich uwsgi api layer to provide some means to communicate between > webapps > - and according to the performance tests by the author, it is a little bit > faster than jetty. > > It is on our production for half a year, quite stable, and very harmonious > with the python app. > > I am not want to sale the solution of uwsgi, but it worth taking a look > and make some comparison. > > Regards, > Mingli > > > On Tue, Jan 14, 2014 at 9:12 PM, Xfeep Zhang <easy...@163.com<javascript:> > > wrote: > >> You are welcome! >> >> Yes, you are right. One JVM instance is embed per Nginx Worker >> process. The number of Nginx Workers is generally the same with the >> number of CPU. >> >> If one Worker crashs the Nginx Master will create a new one so you don't >> worry about JVM crashs accidentally. >> >> Although there will be several JVM instances, there 's only one main >> thread attached with the Nginx Woker process. >> >> So the JVM instance uses less memory and no thread context switch cost in >> every JVM instance. >> >> In some cases If you can use only one JVM instance, you can set the >> Nginx Worker number to be 1 and set jvm_workers > 1, nginx-clojure will >> create >> >> a thread pool with fixed number of thread. >> >> to handle requests for you. >> >> >> On Tuesday, January 14, 2014 5:50:34 PM UTC+8, Feng Shen wrote: >>> >>> Hi, >>> >>> Thanks for your work on nginx-clojure. It looks great! >>> >>> As I know Nginx spawns many processes(correct me if I am wrong), does >>> that mean, there will be many JVM process? >>> >>> >>> >>> >>> On Tuesday, January 14, 2014 4:44:18 PM UTC+8, Xfeep Zhang wrote: >>>> >>>> >>>> I have done the first one. The result is >>>> HERE<https://github.com/ptaoussanis/clojure-web-server-benchmarks>( >>>> https://github.com/ptaoussanis/clojure-web-server-benchmarks ) >>>> Thanks Taoussanis for his invitation to the project >>>> clojure-web-server-benchmarks<https://github.com/ptaoussanis/clojure-web-server-benchmarks>hosted >>>> on Github. >>>> >>>> On Tuesday, January 14, 2014 10:31:03 AM UTC+8, Xfeep Zhang wrote: >>>>> >>>>> You're welcome. >>>>> >>>>> I think there are several difficult phases : >>>>> >>>>> (1) update the test program in >>>>> clojure-web-server-benchmarks<https://github.com/ptaoussanis/clojure-web-server-benchmarks>, >>>>> make the some packages to be the latest. (eg. http-kit from 1.3.0-alpha2 >>>>> --> 2.1.16) and add nginx-php testing >>>>> (2) test about real world size contents by group eg. tiny, small, >>>>> medium, huge. >>>>> (3) test about real world connection circumstances where a lot of >>>>> connection is inactive but keep open. >>>>> (4) try some real asynchronous test to fetch external resources (eg. >>>>> rest service , db) before response to the client. eg. using >>>>> libdrizzle <https://launchpad.net/drizzle> a no-blocking mysql >>>>> client from https://launchpad.net/drizzle >>>>> >>>>> On Tuesday, January 14, 2014 2:41:50 AM UTC+8, Sergey Didenko wrote: >>>>>> >>>>>> Looks very interesting, thank you for your work! >>>>>> >>>>>> I wonder how this is going to improve latency in comparison to nginx >>>>>> + http-kit for some real world test that is not using heavy DB >>>>>> operations. >>>>>> >>>>>> >>>>>> On Mon, Jan 13, 2014 at 5:57 AM, Xfeep Zhang <easy...@163.com> wrote: >>>>>> >>>>>>> >>>>>>> So far I have found why nginx-clojure is slower than http-kit when >>>>>>> 10000 concurrents. (when < = 1000 concurrents nginx-clojure is faster >>>>>>> than >>>>>>> http-kit.) >>>>>>> I have set too many connections per nginx worker (worker_connections >>>>>>> = 20000) . This make nginx only use one worker to handle ab requests >>>>>>> (every request is tiny). >>>>>>> I plan to take note of >>>>>>> c-erlang-java-performance<http://timyang.net/programming/c-erlang-java-performance/>and >>>>>>> fork >>>>>>> clojure-web-server-benchmarks<https://github.com/ptaoussanis/clojure-web-server-benchmarks>to >>>>>>> do some real world tests. >>>>>>> >>>>>>> >>>>>>> >>>>>>> On Sunday, January 12, 2014 11:21:06 PM UTC+8, Xfeep Zhang wrote: >>>>>>>> >>>>>>>> Sorry for my mistake! >>>>>>>> >>>>>>>> 1. In the static file test, the ring-jetty result is about 10 >>>>>>>> concurrents. NOT 10000 concurrents ("Concurrency Level: 10" in >>>>>>>> the >>>>>>>> ab report ). >>>>>>>> 2. In the small string test, All results about three server are >>>>>>>> about 10 concurrents. NOT 10000 concurrents. >>>>>>>> >>>>>>>> There are right results about these two mistake : >>>>>>>> >>>>>>>> 1. static file test >>>>>>>> >>>>>>>> (3) ring-jetty more bad than 10 concurrents >>>>>>>> ============================================================ >>>>>>>> =========== >>>>>>>> Document Path: / >>>>>>>> Document Length: 29686 bytes >>>>>>>> >>>>>>>> *Concurrency Level: 10000* >>>>>>>> Time taken for tests: 6.303 seconds >>>>>>>> Complete requests: 100000 >>>>>>>> Failed requests: 0 >>>>>>>> Write errors: 0 >>>>>>>> Total transferred: 2982200000 bytes >>>>>>>> HTML transferred: 2968600000 bytes >>>>>>>> Requests per second: 15864.43 [#/sec] (mean) >>>>>>>> Time per request: 630.341 [ms] (mean) >>>>>>>> Time per request: 0.063 [ms] (mean, across all concurrent >>>>>>>> requests) >>>>>>>> Transfer rate: 462020.65 [Kbytes/sec] received >>>>>>>> >>>>>>>> Connection Times (ms) >>>>>>>> min mean[+/-sd] median max >>>>>>>> Connect: 12 328 535.0 43 3041 >>>>>>>> Processing: 25 124 112.9 96 3523 >>>>>>>> Waiting: 8 47 99.4 28 3523 >>>>>>>> Total: 52 452 544.5 157 4546 >>>>>>>> >>>>>>>> Percentage of the requests served within a certain time (ms) >>>>>>>> 50% 157 >>>>>>>> 66% 305 >>>>>>>> 75% 1071 >>>>>>>> 80% 1102 >>>>>>>> 90% 1139 >>>>>>>> 95% 1155 >>>>>>>> 98% 1462 >>>>>>>> 99% 3100 >>>>>>>> 100% 4546 (longest request) >>>>>>>> >>>>>>>> >>>>>>>> 2. simple string (10000 concurrents) >>>>>>>> >>>>>>>> http-kit is the fastest. But nginx-clojure is too young and has >>>>>>>> vast room for growth :) >>>>>>>> >>>>>>>> (1) nginx-clojure-0.1.0 >>>>>>>> >>>>>>>> Document Path: / >>>>>>>> Document Length: 15 bytes >>>>>>>> >>>>>>>> *Concurrency Level: 10000* >>>>>>>> Time taken for tests: 2.834 seconds >>>>>>>> Complete requests: 100000 >>>>>>>> Failed requests: 0 >>>>>>>> Write errors: 0 >>>>>>>> Total transferred: 17000000 bytes >>>>>>>> HTML transferred: 1500000 bytes >>>>>>>> Requests per second: 35291.16 [#/sec] (mean) >>>>>>>> Time per request: 283.357 [ms] (mean) >>>>>>>> Time per request: 0.028 [ms] (mean, across all concurrent >>>>>>>> requests) >>>>>>>> Transfer rate: 5858.88 [Kbytes/sec] received >>>>>>>> >>>>>>>> Connection Times (ms) >>>>>>>> min mean[+/-sd] median max >>>>>>>> Connect: 51 118 21.6 118 178 >>>>>>>> Processing: 73 150 33.8 146 263 >>>>>>>> Waiting: 42 110 32.0 104 246 >>>>>>>> Total: 177 268 25.6 269 327 >>>>>>>> >>>>>>>> Percentage of the requests served within a certain time (ms) >>>>>>>> 50% 269 >>>>>>>> 66% 278 >>>>>>>> 75% 285 >>>>>>>> 80% 288 >>>>>>>> 90% 297 >>>>>>>> 95% 309 >>>>>>>> 98% 314 >>>>>>>> 99% 318 >>>>>>>> 100% 327 (longest request) >>>>>>>> >>>>>>>> >>>>>>>> (2) http-kit 2.1.16 >>>>>>>> >>>>>>>> Document Path: / >>>>>>>> Document Length: 15 bytes >>>>>>>> >>>>>>>> *Concurrency Level: 10000* >>>>>>>> Time taken for tests: 2.691 seconds >>>>>>>> Complete requests: 100000 >>>>>>>> Failed requests: 0 >>>>>>>> Write errors: 0 >>>>>>>> Total transferred: 13400000 bytes >>>>>>>> HTML transferred: 1500000 bytes >>>>>>>> Requests per second: 37165.27 [#/sec] (mean) >>>>>>>> Time per request: 269.068 [ms] (mean) >>>>>>>> Time per request: 0.027 [ms] (mean, across all concurrent >>>>>>>> requests) >>>>>>>> Transfer rate: 4863.42 [Kbytes/sec] received >>>>>>>> >>>>>>>> Connection Times (ms) >>>>>>>> min mean[+/-sd] median max >>>>>>>> Connect: 72 118 46.2 114 1094 >>>>>>>> Processing: 31 134 26.1 136 344 >>>>>>>> Waiting: 21 81 33.5 71 273 >>>>>>>> Total: 183 252 43.8 251 1435 >>>>>>>> >>>>>>>> Percentage of the requests served within a certain time (ms) >>>>>>>> 50% 251 >>>>>>>> 66% 258 >>>>>>>> 75% 259 >>>>>>>> 80% 261 >>>>>>>> 90% 263 >>>>>>>> 95% 263 >>>>>>>> 98% 265 >>>>>>>> 99% 266 >>>>>>>> 100% 1435 (longest request) >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> (3) ring-jetty >>>>>>>> >>>>>>>> Document Path: / >>>>>>>> Document Length: 15 bytes >>>>>>>> >>>>>>>> *Concurrency Level: 10000* >>>>>>>> Time taken for tests: 9.740 seconds >>>>>>>> Complete requests: 100000 >>>>>>>> Failed requests: 0 >>>>>>>> Write errors: 0 >>>>>>>> Total transferred: 16700000 bytes >>>>>>>> HTML transferred: 1500000 bytes >>>>>>>> Requests per second: 10267.16 [#/sec] (mean) >>>>>>>> Time per request: 973.979 [ms] (mean) >>>>>>>> Time per request: 0.097 [ms] (mean, across all concurrent >>>>>>>> requests) >>>>>>>> Transfer rate: 1674.43 [Kbytes/sec] received >>>>>>>> >>>>>>>> Connection Times (ms) >>>>>>>> min mean[+/-sd] median max >>>>>>>> Connect: 0 193 399.8 11 3006 >>>>>>>> Processing: 0 51 207.6 5 7050 >>>>>>>> Waiting: 0 39 204.5 4 7050 >>>>>>>> Total: 0 244 482.0 28 8080 >>>>>>>> >>>>>>>> Percentage of the requests served within a certain time (ms) >>>>>>>> 50% 28 >>>>>>>> 66% 79 >>>>>>>> 75% 283 >>>>>>>> 80% 306 >>>>>>>> 90% 1009 >>>>>>>> 95% 1067 >>>>>>>> 98% 1283 >>>>>>>> 99% 1886 >>>>>>>> 100% 8080 (longest request) >>>>>>>> >>>>>>>> >>>>>>>> On Friday, January 10, 2014 8:23:02 AM UTC+8, Julien wrote: >>>>>>>>> >>>>>>>>> Impressive! >>>>>>>>> Did you run some benchmark? How does it compare to ring-jetty and >>>>>>>>> http-kit? >>>>>>>>> >>>>>>>>> Julien >>>>>>>>> >>>>>>>>> Le jeudi 9 janvier 2014 12:42:31 UTC-3, Xfeep Zhang a écrit : >>>>>>>>>> >>>>>>>>>> [image: Alt >>>>>>>>>> text]<https://github.com/xfeep/nginx-clojure/blob/master/logo.png>Nginx-Clojure >>>>>>>>>> >>>>>>>>>> is a Nginx <http://nginx.org/> module for embedding Clojure or >>>>>>>>>> Java programs, typically those >>>>>>>>>> Ring<https://github.com/ring-clojure/ring/blob/master/SPEC>based >>>>>>>>>> handlers. >>>>>>>>>> >>>>>>>>>> There are some core features : >>>>>>>>>> >>>>>>>>>> 1. Compatible with >>>>>>>>>> Ring<https://github.com/ring-clojure/ring/blob/master/SPEC>and >>>>>>>>>> obviously supports those Ring based frameworks, such as Compojure >>>>>>>>>> etc. >>>>>>>>>> 2. One of benifits of Nginx <http://nginx.org/> is worker >>>>>>>>>> processes are automatically restarted by a master process if they >>>>>>>>>> crash >>>>>>>>>> 3. Utilizes lazy headers and direct memory operation between >>>>>>>>>> Nginx <http://nginx.org/> and JVM to fast handle dynamic >>>>>>>>>> contents from Clojure or Java code. >>>>>>>>>> 4. Utilizes Nginx <http://nginx.org/> zero copy file sending >>>>>>>>>> mechanism to fast handle static contents controlled by Clojure or >>>>>>>>>> Java code. >>>>>>>>>> 5. >>>>>>>>>> >>>>>>>>>> Supports Linux x64, Win32 and Mac OS X >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> Use Nginx-Clojure, you can deploy clojure web app on Nginx >>>>>>>>>> without any Java web server. For more detials please check >>>>>>>>>> Nginx-Clojure >>>>>>>>>> github site <https://github.com/xfeep/nginx-clojure>. >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> -- >>>>>>> -- >>>>>>> You received this message because you are subscribed to the Google >>>>>>> Groups "Clojure" group. >>>>>>> To post to this group, send email to clo...@googlegroups.com >>>>>>> Note that posts from new members are moderated - please be patient >>>>>>> with your first post. >>>>>>> To unsubscribe from this group, send email to >>>>>>> clojure+u...@googlegroups.com >>>>>>> For more options, visit this group at >>>>>>> http://groups.google.com/group/clojure?hl=en >>>>>>> --- >>>>>>> You received this message because you are subscribed to the Google >>>>>>> Groups "Clojure" group. >>>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>>> send an email to clojure+u...@googlegroups.com. >>>>>>> For more options, visit https://groups.google.com/groups/opt_out. >>>>>>> >>>>>> >>>>>> -- >> -- >> You received this message because you are subscribed to the Google >> Groups "Clojure" group. >> To post to this group, send email to clo...@googlegroups.com<javascript:> >> Note that posts from new members are moderated - please be patient with >> your first post. >> To unsubscribe from this group, send email to >> clojure+u...@googlegroups.com <javascript:> >> For more options, visit this group at >> http://groups.google.com/group/clojure?hl=en >> --- >> You received this message because you are subscribed to the Google Groups >> "Clojure" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to clojure+u...@googlegroups.com <javascript:>. >> For more options, visit https://groups.google.com/groups/opt_out. >> > > -- -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.