{"id":3834,"date":"2016-10-29T11:21:00","date_gmt":"2016-10-29T09:21:00","guid":{"rendered":"https:\/\/adrhc.go.ro\/wordpress\/?p=3834"},"modified":"2019-10-29T10:13:39","modified_gmt":"2019-10-29T08:13:39","slug":"boost-website-performance","status":"publish","type":"post","link":"https:\/\/adrhc.go.ro\/blog\/boost-website-performance\/","title":{"rendered":"Boost website performance"},"content":{"rendered":"<p><strong>install <em>ab<\/em> command<\/strong><br \/>\n<code>sudo apt install apache2-utils<\/code><\/p>\n<pre class=\"brush:bash shell;gutter:true;toolbar:false\">\r\n### configure \/etc\/sysctl.conf:\r\n# Uncomment the next line to enable TCP\/IP SYN cookies\r\n# See http:\/\/lwn.net\/Articles\/277146\/\r\n# Note: This may impact IPv6 TCP sessions too\r\nnet.ipv4.tcp_syncookies=0\r\n# https:\/\/linux.die.net\/man\/5\/proc\r\n# https:\/\/www.kernel.org\/doc\/Documentation\/sysctl\/fs.txt\r\nfs.file-max = 6815744\r\n# https:\/\/www.kernel.org\/doc\/Documentation\/networking\/ip-sysctl.txt\r\n# https:\/\/linux.die.net\/man\/7\/tcp\r\n# The maximum number of queued connection requests which have still not received an acknowledgement from the connecting client.\r\nnet.ipv4.tcp_max_syn_backlog = 65535\r\n# https:\/\/www.kernel.org\/doc\/Documentation\/sysctl\/net.txt\r\n# Maximum number  of  packets,  queued  on  the  INPUT  side, when the interface receives packets faster than kernel can process them.\r\n# for 1G NIC:\r\nnet.core.netdev_max_backlog = 3000\r\n\r\n### limits (\/etc\/security\/limits.conf)\r\n# see current user limits:\r\nulimit -a\r\n# see process limits (e.g. pid 1660):\r\ncat \/proc\/1660\/limits\r\n\r\n### systemd service\r\n# configure http server's \"max number of open files\" limit (soft and hard):\r\n[Service]\r\nLimitNOFILE=65536\r\n\r\n### debug your website's performance:\r\ntailf apps\/log\/nginx-error.log\r\n# watch for \"too many open files\" problem:\r\ntailf \/var\/log\/syslog | grep SNMP\r\n# watch the main log for other possible problems:\r\ntailf \/var\/log\/syslog\r\n# your application server logs:\r\ntailf ~\/apps\/opt\/apache-tomcat-7.0.64\/logs\/catalina.out\r\n# see (roughly) how many sockets are open:\r\nwatch --interval=1 'netstat -tuna | wc -l'\r\n# or using lsof to count the list of open files:\r\nwatch --interval=1 'lsof | wc -l'\r\n# use apache benchmarking tool:\r\nab -c 1000 -n 10000 -s 80 -H 'Accept-Encoding: gzip' -qd https:\/\/yourhost\/yourwebsite &gt; nginx1k-10k-ssl.txt\r\n\r\n### Conclusion (jetty as application server):\r\nhttp with nginx (+gzip) in front of jetty is 44% slower comparing to jetty direct access.\r\nhttps with nginx (+gzip) in front of jetty is 2x faster comparing to jetty direct access.\r\n\r\n### test with tomcat with Tomcat Native Library:\r\n# https:\/\/tomcat.apache.org\/native-doc\/\r\n# text\/plain:\r\ncurl -i -H \"Accept: text\/plain\" http:\/\/127.0.0.1:8080\/exifweb\/app\/json\/appconfig\/testRAMString\r\n# text\/plain:\r\ncurl -i -H \"Accept: text\/plain\" http:\/\/127.0.0.1:8080\/exifweb\/app\/json\/appconfig\/testRAMStringDeferred\r\n# application\/json:\r\ncurl -i -H \"Accept: application\/json\" http:\/\/127.0.0.1:8080\/exifweb\/app\/json\/appconfig\/testRAMObjectToJson\r\n# application\/json, get all ORDER BY sql:\r\ncurl -i -H \"Accept: application\/json\" http:\/\/127.0.0.1:8080\/exifweb\/app\/json\/appconfig\/testRAMObjectToJsonDeferred\r\n# application\/json, get all ORDER BY sql:\r\ncurl -i -H \"Accept: application\/json\" http:\/\/127.0.0.1:8080\/exifweb\/app\/json\/appconfig\/testGetNoCacheableOrderedAppConfigs\r\n# application\/json, search by indexed string column sql:\r\ncurl -i -H \"Accept: application\/json\" http:\/\/127.0.0.1:8080\/exifweb\/app\/json\/appconfig\/testGetNoCacheableAppConfigByName\r\n\r\nrm -v adr*.txt tom*.txt ng-tom*.txt ngs-tom*.txt ngs-gz*.txt\r\ngrep -P \"Failed|Requests|Document Length|Request rate|Reply status\" adr*.txt tom*.txt ng-tom*.txt ngs-tom*.txt ngs-gz*.txt\r\n# -H 'Accept-Encoding: gzip'\r\n\r\n### HTTP, TOMCAT:\r\n# RAM text\/plain (use -H \"Accept: text\/plain\" anywhere for text\/plain)\r\nab -c 3500 -n 35000 -s 360 -qdr http:\/\/127.0.0.1:8080\/exifweb\/app\/json\/appconfig\/testRAMString > tom-testRAMString-3,5k.txt\r\n# RAM text\/plain deferred\r\nab -c 2300 -n 23000 -s 360 -qdr http:\/\/127.0.0.1:8080\/exifweb\/app\/json\/appconfig\/testRAMStringDeferred > tom-testRAMStringDeferred-2,3k.txt\r\n\r\n# RAM application\/json (use -H \"Accept: application\/json\" anywhere for json)\r\nab -c 3000 -n 30000 -s 360 -qdr http:\/\/127.0.0.1:8080\/exifweb\/app\/json\/appconfig\/testRAMObjectToJson > tom-testRAMObjectToJson-3k.txt\r\n# RAM application\/json deferred\r\nab -c 1900 -n 19000 -s 360 -qdr http:\/\/127.0.0.1:8080\/exifweb\/app\/json\/appconfig\/testRAMObjectToJsonDeferred > tom-testRAMObjectToJsonDeferred-1,9k.txt\r\n\r\n# sql: get all ORDER BY\r\nab -c 675 -n 6750 -s 360 -qdr http:\/\/127.0.0.1:8080\/exifweb\/app\/json\/appconfig\/testGetNoCacheableOrderedAppConfigs > tom-testGetNoCacheableOrderedAppConfigs-675.txt\r\n\r\n# sql: search by indexed string column\r\nab -c 800 -n 8000 -s 360 -qdr http:\/\/127.0.0.1:8080\/exifweb\/app\/json\/appconfig\/testGetNoCacheableAppConfigByName > tom-testGetNoCacheableAppConfigByName-800.txt\r\n\r\n### HTTP, NGINX -> TOMCAT:\r\n# RAM text\/plain\r\nab -c 2250 -n 22500 -s 360 -qdr http:\/\/127.0.0.1\/photos\/app\/json\/appconfig\/testRAMString > ng-tom-testRAMString-2,25k.txt\r\n# RAM text\/plain deferred\r\nab -c 1400 -n 14000 -s 360 -qdr http:\/\/127.0.0.1\/photos\/app\/json\/appconfig\/testRAMStringDeferred > ng-tom-testRAMStringDeferred-1,4k.txt\r\n\r\n# RAM application\/json\r\nab -c 1975 -n 19750 -s 360 -qdr http:\/\/127.0.0.1\/photos\/app\/json\/appconfig\/testRAMObjectToJson > ng-tom-testRAMObjectToJson-1,975k.txt\r\n# RAM application\/json deferred\r\nab -c 1450 -n 14500 -s 360 -qdr http:\/\/127.0.0.1\/photos\/app\/json\/appconfig\/testRAMObjectToJsonDeferred > ng-tom-testRAMObjectToJsonDeferred-1,45k.txt\r\n\r\n# sql: get all ORDER BY\r\nab -c 625 -n 6250 -s 360 -qdr http:\/\/127.0.0.1\/photos\/app\/json\/appconfig\/testGetNoCacheableOrderedAppConfigs > ng-tom-testGetNoCacheableOrderedAppConfigs-625.txt\r\n\r\n# sql: search by indexed string column\r\nab -c 710 -n 7100 -s 360 -qdr http:\/\/127.0.0.1\/photos\/app\/json\/appconfig\/testGetNoCacheableAppConfigByName > ng-tom-testGetNoCacheableAppConfigByName-710.txt\r\n\r\n### HTTPS, TOMCAT:\r\n# RAM text\/plain\r\nab -c 90 -n 900 -s 360 -qdr https:\/\/127.0.0.1:8443\/exifweb\/app\/json\/appconfig\/testRAMString > toms-testRAMString-90.txt\r\n\r\n# RAM application\/json\r\nab -c 90 -n 900 -s 360 -qdr https:\/\/127.0.0.1:8443\/exifweb\/app\/json\/appconfig\/testRAMObjectToJson > toms-testRAMObjectToJson-90.txt\r\n\r\n# sql: get all ORDER BY\r\nab -c 90 -n 900 -s 360 -qdr https:\/\/127.0.0.1:8443\/exifweb\/app\/json\/appconfig\/testGetNoCacheableOrderedAppConfigs > toms-testGetNoCacheableOrderedAppConfigs-90.txt\r\n\r\n# sql: search by indexed string column\r\nab -c 90 -n 900 -s 360 -qdr https:\/\/127.0.0.1:8443\/exifweb\/app\/json\/appconfig\/testGetNoCacheableAppConfigByName > toms-testGetNoCacheableAppConfigByName-90.txt\r\n\r\n### HTTPS, NGINX -> TOMCAT:\r\n# RAM text\/plain\r\nab -c 550 -n 5500 -s 360 -qdr https:\/\/127.0.0.1\/photos\/app\/json\/appconfig\/testRAMString > ngs-tom-testRAMString-550.txt\r\n\r\n# RAM application\/json\r\nab -c 550 -n 5500 -s 360 -qdr https:\/\/127.0.0.1\/photos\/app\/json\/appconfig\/testRAMObjectToJson > ngs-tom-testRAMObjectToJson-550.txt\r\n\r\n# sql: get all ORDER BY\r\nab -c 410 -n 4100 -s 360 -qdr https:\/\/127.0.0.1\/photos\/app\/json\/appconfig\/testGetNoCacheableOrderedAppConfigs > ngs-tom-testGetNoCacheableOrderedAppConfigs-410.txt\r\n\r\n# sql: search by indexed string column\r\nab -c 450 -n 4500 -s 360 -qdr https:\/\/127.0.0.1\/photos\/app\/json\/appconfig\/testGetNoCacheableAppConfigByName > ngs-tom-testGetNoCacheableAppConfigByName-450.txt\r\n\r\n### HTTPS, NGINX (gzip) -> TOMCAT:\r\n# RAM text\/plain\r\nab -c 560 -n 5600 -s 360 -qdr -H 'Accept-Encoding: gzip' https:\/\/127.0.0.1\/photos\/app\/json\/appconfig\/testRAMString > ngs-gz-tom-testRAMString-560.txt\r\n\r\n# RAM application\/json\r\nab -c 560 -n 5600 -s 360 -qdr -H 'Accept-Encoding: gzip' https:\/\/127.0.0.1\/photos\/app\/json\/appconfig\/testRAMObjectToJson > ngs-gz-tom-testRAMObjectToJson-560.txt\r\n\r\n# sql: get all ORDER BY\r\nab -c 405 -n 4050 -s 360 -qdr -H 'Accept-Encoding: gzip' https:\/\/127.0.0.1\/photos\/app\/json\/appconfig\/testGetNoCacheableOrderedAppConfigs > ngs-gz-tom-testGetNoCacheableOrderedAppConfigs-405.txt\r\n\r\n# sql: search by indexed string column\r\nab -c 445 -n 4450 -s 360 -qdr -H 'Accept-Encoding: gzip' https:\/\/127.0.0.1\/photos\/app\/json\/appconfig\/testGetNoCacheableAppConfigByName > ngs-gz-tom-testGetNoCacheableAppConfigByName-445.txt\r\n\r\n### NGINX\r\nab -c 625 -n 6250 -s 360 -qdr https:\/\/127.0.0.1\/public\/mysqld.sh > ngs-625.txt\r\nab -c 4600 -n 40000 -s 360 -qdr http:\/\/127.0.0.1\/public\/mysqld.sh > ngs-4600.txt\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>install ab command sudo apt install apache2-utils ### configure \/etc\/sysctl.conf: # Uncomment the next line to enable TCP\/IP SYN cookies # See http:\/\/lwn.net\/Articles\/277146\/ # Note: This may impact IPv6 TCP sessions too net.ipv4.tcp_syncookies=0 # https:\/\/linux.die.net\/man\/5\/proc # https:\/\/www.kernel.org\/doc\/Documentation\/sysctl\/fs.txt fs.file-max = 6815744 [&hellip;]<\/p>\n<div class=\"link-more\"><a href=\"https:\/\/adrhc.go.ro\/blog\/boost-website-performance\/#more-3834\" class=\"more-link\">Continue reading &#10142; <span class=\"screen-reader-text\">Boost website performance<\/span><\/a><\/div>","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6,8,44,11],"tags":[64],"class_list":["post-3834","post","type-post","status-publish","format-standard","hentry","category-configuration","category-howto","category-http-web-server","category-linux","tag-performance"],"_links":{"self":[{"href":"https:\/\/adrhc.go.ro\/blog\/wp-json\/wp\/v2\/posts\/3834","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/adrhc.go.ro\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/adrhc.go.ro\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/adrhc.go.ro\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/adrhc.go.ro\/blog\/wp-json\/wp\/v2\/comments?post=3834"}],"version-history":[{"count":0,"href":"https:\/\/adrhc.go.ro\/blog\/wp-json\/wp\/v2\/posts\/3834\/revisions"}],"wp:attachment":[{"href":"https:\/\/adrhc.go.ro\/blog\/wp-json\/wp\/v2\/media?parent=3834"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/adrhc.go.ro\/blog\/wp-json\/wp\/v2\/categories?post=3834"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/adrhc.go.ro\/blog\/wp-json\/wp\/v2\/tags?post=3834"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}