From: Eric Wong <e@80x24.org>
To: unicorn-public@bogomips.org
Subject: [PATCH] use the monotonic clock under Ruby 2.1+
Date: Sun, 18 Jan 2015 03:39:16 +0000 [thread overview]
Message-ID: <20150118033916.GA4478@dcvr.yhbt.net> (raw)
The monotonic clock is immune to time adjustments so it is not
thrown off by misconfigured clocks. Process.clock_gettime also
generates less garbage on 64-bit systems due to the use of Flonum.
---
lib/unicorn/http_server.rb | 29 +++++++++++++++++++++--------
1 file changed, 21 insertions(+), 8 deletions(-)
diff --git a/lib/unicorn/http_server.rb b/lib/unicorn/http_server.rb
index a523fce..e0c0370 100644
--- a/lib/unicorn/http_server.rb
+++ b/lib/unicorn/http_server.rb
@@ -265,7 +265,7 @@ class Unicorn::HttpServer
# is signalling us too often.
def join
respawn = true
- last_check = Time.now
+ last_check = time_now
proc_name 'master'
logger.info "master process ready" # test_exec.rb relies on this message
@@ -283,7 +283,7 @@ class Unicorn::HttpServer
when nil
# avoid murdering workers after our master process (or the
# machine) comes out of suspend/hibernation
- if (last_check + @timeout) >= (last_check = Time.now)
+ if (last_check + @timeout) >= (last_check = time_now)
sleep_time = murder_lazy_workers
else
sleep_time = @timeout/2.0 + 1
@@ -337,8 +337,8 @@ class Unicorn::HttpServer
# Terminates all workers, but does not exit master process
def stop(graceful = true)
self.listeners = []
- limit = Time.now + timeout
- until WORKERS.empty? || Time.now > limit
+ limit = time_now + timeout
+ until WORKERS.empty? || time_now > limit
if graceful
soft_kill_each_worker(:QUIT)
else
@@ -470,7 +470,7 @@ class Unicorn::HttpServer
# forcibly terminate all workers that haven't checked in in timeout seconds. The timeout is implemented using an unlinked File
def murder_lazy_workers
next_sleep = @timeout - 1
- now = Time.now.to_i
+ now = time_now.to_i
WORKERS.dup.each_pair do |wpid, worker|
tick = worker.tick
0 == tick and next # skip workers that haven't processed any clients
@@ -650,7 +650,7 @@ class Unicorn::HttpServer
begin
nr < 0 and reopen_worker_logs(worker.nr)
nr = 0
- worker.tick = Time.now.to_i
+ worker.tick = time_now.to_i
tmp = ready.dup
while sock = tmp.shift
# Unicorn::Worker#kgio_tryaccept is not like accept(2) at all,
@@ -658,7 +658,7 @@ class Unicorn::HttpServer
if client = sock.kgio_tryaccept
process_client(client)
nr += 1
- worker.tick = Time.now.to_i
+ worker.tick = time_now.to_i
end
break if nr < 0
end
@@ -675,7 +675,7 @@ class Unicorn::HttpServer
ppid == Process.ppid or return
# timeout used so we can detect parent death:
- worker.tick = Time.now.to_i
+ worker.tick = time_now.to_i
ret = IO.select(readers, nil, nil, @timeout) and ready = ret[0]
rescue => e
redo if nr < 0 && readers[0]
@@ -799,4 +799,17 @@ class Unicorn::HttpServer
raise ArgumentError, "no listeners" if LISTENERS.empty?
NEW_LISTENERS.clear
end
+
+ # try to use the monotonic clock in Ruby >= 2.1, it is immune to clock
+ # offset adjustments and generates less garbage (Float vs Time object)
+ begin
+ Process.clock_gettime(Process::CLOCK_MONOTONIC)
+ def time_now
+ Process.clock_gettime(Process::CLOCK_MONOTONIC)
+ end
+ rescue NameError, NoMethodError
+ def time_now # Ruby <= 2.0
+ Time.now
+ end
+ end
end
--
EW
reply other threads:[~2015-01-18 3:39 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://yhbt.net/unicorn/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20150118033916.GA4478@dcvr.yhbt.net \
--to=e@80x24.org \
--cc=unicorn-public@bogomips.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://yhbt.net/unicorn.git/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).