From: sam.saffron@... Date: 2018-05-03T06:07:07+00:00 Subject: [ruby-core:86860] [Ruby trunk Feature#14723] [WIP] sleepy GC Issue #14723 has been updated by sam.saffron (Sam Saffron). I found one place where we were not using async_exec so I changed it to use async_exec... this is revised numbers: Pre patch: ``` categories: 50: 53 75: 59 90: 63 99: 76 home: 50: 57 75: 64 90: 68 99: 136 topic: 50: 58 75: 61 90: 68 99: 110 categories_admin: 50: 96 75: 102 90: 108 99: 184 home_admin: 50: 104 75: 112 90: 122 99: 213 topic_admin: 50: 115 75: 121 90: 139 99: 184 timings: load_rails: 4936 ruby-version: 2.6.0-p-1 rss_kb: 193500 pss_kb: 134214 memorysize: 7.79 GB virtual: vmware architecture: amd64 operatingsystem: Ubuntu processor0: Intel(R) Core(TM) i7-4770K CPU @ 3.50GHz physicalprocessorcount: 2 kernelversion: 4.15.0 rss_kb_21961: 305616 pss_kb_21961: 243099 rss_kb_22009: 304644 pss_kb_22009: 241972 rss_kb_22133: 304108 pss_kb_22133: 241388 ``` Post patch: ``` Your Results: (note for timings- percentile is first, duration is second in millisecs) Unicorn: (workers: 3) Include env: false Iterations: 200, Best of: 1 Concurrency: 1 --- categories: 50: 54 75: 59 90: 66 99: 84 home: 50: 57 75: 62 90: 65 99: 139 topic: 50: 56 75: 61 90: 67 99: 104 categories_admin: 50: 95 75: 99 90: 106 99: 179 home_admin: 50: 99 75: 103 90: 106 99: 195 topic_admin: 50: 109 75: 114 90: 118 99: 163 timings: load_rails: 4851 ruby-version: 2.6.0-p-1 rss_kb: 195164 pss_kb: 136384 memorysize: 7.79 GB virtual: vmware architecture: amd64 operatingsystem: Ubuntu processor0: Intel(R) Core(TM) i7-4770K CPU @ 3.50GHz physicalprocessorcount: 2 kernelversion: 4.15.0 rss_kb_19222: 305328 pss_kb_19222: 243213 rss_kb_19267: 303188 pss_kb_19267: 240952 rss_kb_19384: 307992 pss_kb_19384: 245778 ``` perf change seems a tiny bit more noticable. ---------------------------------------- Feature #14723: [WIP] sleepy GC https://bugs.ruby-lang.org/issues/14723#change-71825 * Author: normalperson (Eric Wong) * Status: Open * Priority: Normal * Assignee: * Target version: ---------------------------------------- The idea is to use "idle time" when process is otherwise sleeping and using no CPU time to perform GC. It makes sense because real world traffic sees idle time due to network latency and waiting for user input. Right now, it's Linux-only. Future patches will affect other sleeping functions: IO.select, Kernel#sleep, Thread#join, Process.waitpid, etc... I don't know if this patch can be implemented for win32, right now it's just dummy functions and that will be somebody elses job. But all pthreads platforms should eventually benefit. Before this patch, the entropy-dependent script below takes 95MB consistently on my system. Now, depending on the amount of entropy on my system, it takes anywhere from 43MB to 75MB. I'm using /dev/urandom to simulate real-world network latency variations. There is no improvement when using /dev/zero because the process is never idle. require 'net/http' require 'digest/md5' Thread.abort_on_exception = true s = TCPServer.new('127.0.0.1', 0) len = 1024 * 1024 * 1024 th = Thread.new do c = s.accept c.readpartial(16384) c.write("HTTP/1.0 200 OK\r\nContent-Length: #{len}\r\n\r\n") IO.copy_stream('/dev/urandom', c, len) c.close end addr = s.addr Net::HTTP.start(addr[3], addr[1]) do |http| http.request_get('/') do |res| dig = Digest::MD5.new res.read_body { |buf| dig.update(buf) } puts dig.hexdigest end end The above script is also dependent on net/protocol using read_nonblock. Ordinary IO objects will need IO#nonblock=true to see benefits (because they never hit rb_wait_for_single_fd) * gc.c (rb_gc_inprogress): new function (rb_gc_step): ditto * internal.h: declare prototypes for new gc.c functions * thread_pthread.c (gvl_contended_p): new function * thread_win32.c (gvl_contended_p): ditto (dummy) * thread.c (rb_wait_for_single_fd w/ ppoll): use new functions to perform GC while GVL is uncontended and GC is lazy sweeping or incremental marking [ruby-core:86265] ``` 2 part patch broken out https://80x24.org/spew/20180429035007.6499-2-e@80x24.org/raw https://80x24.org/spew/20180429035007.6499-3-e@80x24.org/raw Also on my "sleepy-gc" git branch @ git://80x24.org/ruby.git ---Files-------------------------------- sleepy-gc-wip-v1.diff (5.37 KB) -- https://bugs.ruby-lang.org/ Unsubscribe: