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 <easyj...@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 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.
>

-- 
-- 
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.

Reply via email to