Re: [Nethttpd-plex] Poor performance on FreeBSD 8.2
Stéphane Legrand <[email protected]> Tue, 05 Jul 2011 22:12:40 +0200
| Newsgroups | gmane.comp.lang.ocaml.lib.net.devel |
|---|---|
| Message-ID | <[email protected]> |
Hello, I tested your program on my FreeBSD system and i also get 10 req/sec : ./a.out -m get -v 'http://127.0.0.1:4444/' Total time: 10.253 s (9.75 req/s) cURL time: 10.250 s (9.76 req/s) successes: 100/100 Then i tried the same program with a local Apache server : > ./a.out -m get -v 'http://192.168.10.20/' Total time: 10.136 s (9.87 req/s) cURL time: 10.123 s (9.88 req/s) successes: 100/100 Finally, i tried with an external web site : > ./a.out -m get -v 'http://www.google.fr/' Total time: 10.345 s (9.67 req/s) cURL time: 10.341 s (9.67 req/s) successes: 100/100 So, whichever the HTTP server i try, i always get 10 req/sec. It seems that the problem is more related to curl layer ?? Regards, Stéphane. Le lundi 04 juillet 2011 à 19:50 -0300, Matías Giovannini a écrit : > After a little ktrace'ing, I've found the following puzzling sequence > of events. Nethttpd receives the request, processes it, sends the > headers, the response, and finishes with "0\r\n\r\n". It gets ready to > accept the next request, after 100 ms of wait in poll: > > > 74420 xbi_mock 1309817486.450514 CALL gettimeofday(0x7fffffffde70,0) > 74420 xbi_mock 1309817486.450518 RET gettimeofday 0 > 74420 xbi_mock 1309817486.450521 CALL poll(0x80195a180,0x1,0x1770) > 74420 xbi_mock 1309817486.450524 RET poll 1 > 74420 xbi_mock 1309817486.450527 CALL > recvfrom(0x5,0x7fffffff9e30,0x2000,0,0,0) > 74420 xbi_mock 1309817486.450530 RET recvfrom -1 errno 35 Resource > temporarily unavailable > 74420 xbi_mock 1309817486.450552 CALL gettimeofday(0x7fffffffde90,0) > 74420 xbi_mock 1309817486.450557 RET gettimeofday 0 > 74420 xbi_mock 1309817486.450560 CALL poll(0x80195a180,0x1,0x1770) > 74420 xbi_mock 1309817486.550412 RET poll 1 > 74420 xbi_mock 1309817486.550424 CALL > recvfrom(0x5,0x7fffffff9e50,0x2000,0,0,0) > 74420 xbi_mock 1309817486.550430 GIO fd 5 read 644 bytes > > > I have omitted the not very interesting sequence of events leading to > this; note that the socket is FD 5. The first poll returns immediately > but recvfrom(FD=5) fails with EWOULDBLOCK; the second poll is tried > with what seems 100 ms delay, and the next recvfrom eventually > succeeds. > > > These 100ms neatly account for my ~10 req/s throughput. > > > The full ktrace log file is available upon request. Regards, > Matías. > > > On Mon, Jul 4, 2011 at 6:13 PM, Matías Giovannini <[email protected]> > wrote: > Stéphane, > > Thank you for your reply. I miscopied the configuration. That > was a test I made to see if semaphores were having an impact > on throughput, which I found they didn't. The FreeBSD kernel > has the sem module compiled in. > > > I'll try to test the bytecode version to see if there's any > difference. > > > The final configuration from an unmodified 3.3.3 tarball is: > > > Welcome to Ocamlnet version 3.3.3 > Checking operating system... FreeBSD > > > *** Note that you might need to load the 'sem' kernel > *** module to make semaphores work: kldload sem > > > Checking for findlib... found > Checking multi-threading support... posix (ok) > Checking word size... 64 bit > Checking endianess... little > Checking for GPROF... found > Checking for PCRE... found > Checking whether Ocaml has Printexc.register_printer... found > Checking whether Ocaml has fancy page tables... found > Checking for POSIX shared memory... found > Checking for POSIX semaphores... found > Checking for POSIX fadvise... not found > Checking for POSIX fallocate... not found > Checking for POSIX memalign... found > Checking for POSIX pthread... found > Checking for syslog... found > Checking for POSIX functions like openat... found > Checking for fchdir... found > Checking for fdopendir... found > Checking for GPROF... found > Checking for win32... no > Checking for camlzip... found > > > Effective options: > -enable-pcre > -disable-gtk > -disable-gtk2 > -disable-tcl > -disable-ssl > -enable-zip > -disable-crypto > -disable-apache > -with-nethttpd > -without-rpc-auth-dh > -bindir /usr/local/bin > -datadir /usr/local/lib/ocaml/site-lib/netstring > > > Writing Makefile.conf > > > Please check Makefile.conf. > > > The test harness is an OCaml-cURL script: > > > let xml = "<?xml version='1.0' encoding='utf-8'?>\r\n\ > <soapenv:Envelope xmlns:soapenv= > \"http://schemas.xmlsoap.org/soap/envelope/\"\ > ><soapenv:Body\ > ></soapenv:Body\ > ></soapenv:Envelope>" (* '"' *) > > > let make_post url = > let curl = new Curl.handle in > curl#set_writefunction String.length; (* ignore result *) > curl#set_verbose false; > curl#set_post true; > curl#set_httpheader [ > "Content-Type: text/xml; charset=\"UTF-8\""; > "SOAPAction: \"\""; > ]; > curl#set_postfields xml; > curl#set_postfieldsize (String.length xml); > curl#set_url url; > curl > > > let make_get url = > let curl = new Curl.handle in > curl#set_writefunction String.length; (* ignore result *) > curl#set_verbose false; > curl#set_post false; > curl#set_url url; > curl > > > let run_test ?(verbose=false) count curl = > let n_ok = ref 0 > and time = ref 0. in > let lap = Unix.gettimeofday () in > for i = 1 to count do > curl#perform; > if curl#get_httpcode = 200 then incr n_ok; > time := !time +. curl#get_totaltime > done; > let lap = Unix.gettimeofday () -. lap in > if verbose then Printf.printf "Total time: %.3f s (%.2f > req/s)\ncURL time: %.3f s (%.2f req/s)\nsuccesses: %d/%d\n" > lap (float count /. lap) > !time (float count /. !time) > !n_ok count > > > let main () = > let verbose = ref false > and count = ref 100 > and method_ = ref make_post > and url = ref None in > let set_url s = match !url with > | None -> url := Some s > | Some _ -> raise (Arg.Bad "URL already specified") > in > let set_method s = match s with > | "p" | "post" -> method_ := make_post > | "g" | "get" -> method_ := make_get > | _ -> assert false > in > let usage = "usage: " ^ (Filename.basename > Sys.executable_name) ^ " [options] <url>" in > let opt_list = Arg.align [ > "-m", Arg.Symbol (["g";"get";"p";"post"], set_method), " > Method (default \"post\")"; > "-n", Arg.Set_int count, Printf.sprintf " Test > count (default %d)" !count; > "-v", Arg.Set verbose, " > Verbose output"; > ] in > Arg.parse opt_list set_url usage; > try > let url = match !url with > | None -> raise (Arg.Bad "Must specify URL") > | Some s -> s > and verbose = !verbose in > Curl.global_init Curl.CURLINIT_GLOBALALL; > let curl = !method_ url in > run_test ~verbose !count curl; > curl#cleanup; > Curl.global_cleanup (); > exit 0 > with Sys_error msg -> prerr_endline msg; exit 1 > | Arg.Bad msg -> prerr_endline msg; exit 2 > | Curl.CurlException (Curl.CURLE_COULDNT_CONNECT, _, _) -> > Printf.eprintf "Can't connect to host\n"; > exit 1 > | Curl.CurlException (_, code, message) -> > Printf.eprintf "cURL error %d: %s\n" code message; > exit 1 > | e -> prerr_endline ("Unexpected error: " ^ > Printexc.to_string e); exit 1 > > > let () = main () > > > > > On Mon, Jul 4, 2011 at 5:56 PM, Stéphane Legrand > <[email protected]> wrote: > Hello, > > I did the following tests on my configuration : > > FreeBSD 8.2-STABLE > Intel Celeron D CPU 3.33GHz (32 bits) > 1 GB > > > - Native netplex with output in gnome terminal, > 127.0.0.1 : > > siege -c 1 -t 60S -b 'http://127.0.0.1:4444/' > > Transactions: 14752 hits > Availability: 100.00 % > Elapsed time: 59.13 secs > Data transferred: 31.40 MB > Response time: 0.00 secs > Transaction rate: 249.47 trans/sec > Throughput: 0.53 MB/sec > Concurrency: 0.78 > Successful transactions: 14752 > Failed transactions: 0 > Longest transaction: 0.15 > Shortest transaction: 0.00 > > > - Native netplex with output in gnome terminal, > localhost : > > siege -c 1 -t 60S -b 'http://localhost:4444/' > > Transactions: 10554 hits > Availability: 100.00 % > Elapsed time: 59.67 secs > Data transferred: 22.47 MB > Response time: 0.00 secs > Transaction rate: 176.87 trans/sec > Throughput: 0.38 MB/sec > Concurrency: 0.85 > Successful transactions: 10554 > Failed transactions: 0 > Longest transaction: 0.09 > Shortest transaction: 0.00 > > > - Bytecode netplex with output in gnome terminal, > 127.0.0.1 : > > siege -c 1 -t 60S -b 'http://127.0.0.1:4444/' > > Transactions: 6343 hits > Availability: 100.00 % > Elapsed time: 59.72 secs > Data transferred: 13.50 MB > Response time: 0.01 secs > Transaction rate: 106.21 trans/sec > Throughput: 0.23 MB/sec > Concurrency: 0.99 > Successful transactions: 6343 > Failed transactions: 0 > Longest transaction: 0.15 > Shortest transaction: 0.00 > > > - Bytecode netplex with output in gnome terminal, > localhost : > > siege -c 1 -t 60S -b 'http://localhost:4444/' > > Transactions: 6204 hits > Availability: 100.00 % > Elapsed time: 59.56 secs > Data transferred: 13.21 MB > Response time: 0.01 secs > Transaction rate: 104.16 trans/sec > Throughput: 0.22 MB/sec > Concurrency: 0.99 > Successful transactions: 6204 > Failed transactions: 0 > Longest transaction: 0.14 > Shortest transaction: 0.00 > > > As you can see, the minimum is 104 req/sec. Can you > please specify your > test where you get 10 req/sec ? If i can, i will try > to run it on my > computer. > > And here is my output of configure. POSIX semaphores > are found, i do > have the sem kernel module loaded before to run > configure. I don't know > if it could explain the slowness you see ? > > > Welcome to Ocamlnet version 3.3.3 > Checking operating system... FreeBSD > > *** Note that you might need to load the 'sem' kernel > *** module to make semaphores work: kldload sem > > Checking for findlib... found > Checking multi-threading support... posix (ok) > > Checking word size... 32 bit > Checking endianess... little > Checking for GPROF... found > Checking for PCRE... found > Checking whether Ocaml has > Printexc.register_printer... found > Checking whether Ocaml has fancy page tables... found > Checking for POSIX shared memory... found > > Checking for POSIX semaphores... found > Checking for POSIX fadvise... not found > Checking for POSIX fallocate... not found > Checking for POSIX memalign... found > Checking for POSIX pthread... found > Checking for syslog... found > > Checking for POSIX functions like openat... found > Checking for fchdir... found > Checking for fdopendir... found > Checking for GPROF... found > Checking for win32... no > > Checking for cryptokit... found > > > > Regards, > Stéphane. > > Le lundi 04 juillet 2011 à 12:16 -0300, Matías > Giovannini a écrit : > > > Hello, > > > > > > I'm stymied about a huge discrepancy in performance > for Nethttpd-plex > > on FreeBSD 8.2, compared to Mac OS X 10.6.8. > > > > > > Testing with a OCaml-cURL client making purely > sequential GET requests > > on the loopback interface in a loop against > > examples/nethttpd/netplex.ml I get > 900 req/sec on > Mac OS X 10.6.8 > > (MacBook, Intel Core 2 Duo 2.0 GHz, 2 GB RAM) > compared to aprox. 10 > > req/sec on FreeBSD 8.2 (Quad-core amd64, 8 GB RAM). > > > > > > Looking at the configuration results, I tried > manually disabled POSIX > > semaphores and *at functions on FreeBSD to see if > that had any impact, > > to no avail. > > > > > > Testing against a very simple HTTP/1.0 "server" that > just accepts and > > prints a zero-length 200 OK response I get double > throughput on > > FreeBSD compared to Mac OS X (6800 req/s vs. 3300 > req/s), so I can > > rule out networking stack differences. > > > > > > I'd really appreciate any guidance on this issue. > > > > > > The output of configure on FreeBSD is as follows: > > > > > > Welcome to Ocamlnet version 3.3.3 > > Checking operating system... FreeBSD > > > > > > *** Note that you might need to load the 'sem' > kernel > > *** module to make semaphores work: kldload sem > > > > > > Checking for findlib... found > > Checking multi-threading support... posix (ok) > > Checking word size... 64 bit > > Checking endianess... little > > Checking for GPROF... found > > Checking for PCRE... found > > Checking whether Ocaml has > Printexc.register_printer... found > > Checking whether Ocaml has fancy page tables... > found > > Checking for POSIX shared memory... found > > Checking for POSIX semaphores... not found > > Checking for POSIX fadvise... not found > > Checking for POSIX fallocate... not found > > Checking for POSIX memalign... found > > Checking for POSIX pthread... found > > Checking for syslog... found > > Checking for POSIX functions like openat... not > found (or incomplete) > > Checking for fchdir... found > > Checking for fdopendir... found > > Checking for GPROF... found > > Checking for win32... no > > Checking for camlzip... found > > > > > > Effective options: > > -enable-pcre > > -disable-gtk > > -disable-gtk2 > > -disable-tcl > > -disable-ssl > > -enable-zip > > -disable-crypto > > -disable-apache > > -with-nethttpd > > -without-rpc-auth-dh > > -bindir /usr/local/bin > > -datadir /usr/local/lib/ocaml/site-lib/netstring > > > > > > Writing Makefile.conf > > > > > > > ------------------------------------------------------------------------------ > All of the data generated in your IT infrastructure is > seriously valuable. > Why? It contains a definitive record of application > performance, security > threats, fraudulent activity, and more. Splunk takes > this data and makes > sense of it. IT sense. And common sense. > http://p.sf.net/sfu/splunk-d2d-c2 > _______________________________________________ > Ocamlnet-devel mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/ocamlnet-devel > > > > ------------------------------------------------------------------------------ All of the data generated in your IT infrastructure is seriously valuable. Why? It contains a definitive record of application performance, security threats, fraudulent activity, and more. Splunk takes this data and makes sense of it. IT sense. And common sense. http://p.sf.net/sfu/splunk-d2d-c2 _______________________________________________ Ocamlnet-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/ocamlnet-devel