I have check the uwsgi document again and the JVM integration document is HERE <http://uwsgi-docs.readthedocs.org/en/latest/JWSGI.html>http://uwsgi-docs.readthedocs.org/en/latest/JWSGI.html .
When using uwsgi to integrate JVM, the JVM process is not the same process of Nginx worker. So it can not avoid IPC cost or socket cost ! So it will use more system handle (at least double ones) and more copy operataion between process and maybe more memory cost. So I think using uwsgi to integrate JVM maybe will not be so fast! On Wednesday, January 15, 2014 10:10:40 AM UTC+8, Xfeep Zhang wrote: > > 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> 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 >>> 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 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.