about summary refs log tree commit homepage
DateCommit message (Collapse)
2015-04-22dev: remove isolate dependency
It seems unnecessary with current versions of RubyGems supporting development dependencies.
2015-04-22FAQ: add entry for Rails autoflush_log
Thanks to Cedric Maion for bringing this up on the mailing list: http://bogomips.org/unicorn-public/m/20140703144048.GA6674@cedric-maion.com
2015-04-22ISSUES: update with mailing list subscription
mlmmj seems quite usable and maintainable, so we'll run it.
2015-04-07favor more string literals for cold call sites
Literal regexps cost over 450 bytes of memory per-site and unnecessary use of them costs memory in places where raw execution speed does not matter. Nowadays, we can rely on String#end_with? (introduced in 1.8.7) for improved readability, too.
2015-03-12doc: document Etc.nprocessors for worker_processes
Ruby 2.2 has Etc.nprocessors, and using that (directly or as a factor) for setting worker_processes is often (but not always) appropriate.
2015-03-12doc: document UNICORN_FD in manpage
Due to the prevalence of socket activation in modern init systems, we shall document UNICORN_FD (previously an implementation detail) in the manpage.
2015-03-02socket_helper: update comments
We had HTTPS support but dropped it(*) and some wacky servers out there do work better with TCP_DEFER_ACCEPT disabled. (*) No, we will not support HTTP/2, that is for nginx
2015-03-02http: remove experimental dechunk! method
It was never used anywhere AFAIK and wastes precious bytes.
2015-03-02http: remove deprecated reset method
We use the `clear' method everywhere nowadays.
2015-03-02save about 200 bytes of memory on x86-64
Empty classes do not need a heavy class definition scope.
2015-03-01Links: mark Rainbows! as historical, reference yahns
Pushing the boundaries of bad marketing :P
2015-03-01reduce and localize constant string use
Literal String#freeze avoids allocations since Ruby 2.1 via the opt_str_freeze instruction, so we can start relying on it in some places as Ruby 2.1 adoption increases. The 100-continue handling is a good place to start since it is an uncommonly-used code path which benefits from size reduction and the negative performance impact is restricted to a handful of users. HTTP_RESPONSE_START can safely live in http_request.rb as its usage does not cross namespace boundaries The goal is to eventually eliminate Unicorn::Const entirely.
2015-03-01const: drop constants used by Rainbows!
Rainbows! (in maintenance mode) will need to define it's own constants in the future. We'll trim down our constant usage in subsequent commits as we take advantage of Ruby VM improvements.
2015-02-18explain 11 byte magic number for self-pipe
Oops, this should've been explained long ago but apparently not. In response to a comment on http://www.sitepoint.com/the-self-pipe-trick-explained/ > Does anybody know why both unicorn and foreman read 11 bytes from > self-pipe? Unfortunately I couldn't find a way to comment on the site on a JavaScript-free browser nor does it seem possible without registering. Again, anybody can send plain-text mail to: unicorn-public@bogomips.org No registration, no real name policy, no terms-of-service, just plain-text. Feel free to use Tor, mixmaster or any anonymity service, too.
2015-02-12http_server: favor ivars over constants
In 1.9+ at least, instance variables use less space than constants in class tables and bytecode, leading to ~700 byte reduction in bytecode overhead on 64-bit and a reduction in constant table/entries of the Unicorn::HttpServer class.
2015-02-12ISSUES: add section for bugs in other projects
This is not anything new, just documenting what has been going on since the beginning. There's been a small number of generic networking (or mm) bugs in the kernel which affect unicorn, but are usually found and fixed with more popular, non-Ruby servers, first. Aside from generic performance problems, I don't think there's ever been a glibc bug which affected unicorn.
2015-02-06favor "a.b(&:c)" form over "a.b { |x| x.c }"
The former is shorter Ruby code and also generates smaller bytecode.
2015-02-06test_socket_helper: do not depend on SO_REUSEPORT
Older Rubies (2.0) may not define SO_REUSEPORT even if the kernel and libc support it
2015-02-06fix uninstalled testing and reduce require paths
This fixes a bug introduced in commit fe83ead4eae6f011fa15f506cd80cb4256813a92 (GNUmakefile: fix clean gem build + reduce build cruft) which broke clean Ruby installations without an existing unicorn gem installed :x
2015-02-06doc: update support status for Ruby versions
unicorn 5 will not support Ruby 1.8 anymore. Drop mentions of Rubinius, too, it's too difficult to support due to the proprietary and registration-required nature of its bug tracker. The smaller memory footprint and CoW-friendly memory allocator in mainline Ruby is a better fit for unicorn, anyways. Since Ruby 1.9+ bundles RubyGems and gem startup is faster nowadays, we'll just depend on that instead of not loading RubyGems. Drop the local.mk.sample file, too, since it's way out-of-date and probably isn't useful (I have not used it in a while).
2015-02-05use require_relative to reduce syscalls at startup
require_relative appeared in Ruby 1.9.2 to speed up load times by avoiding needless open() syscalls. This has no effect if you're using RUBYLIB or the '-I' option when running ruby(1), but avoids searching paths in other gems. This does not affect unicorn greatly as unicorn does not activate many gems, but still leads to reducing ~45 syscalls during startup.
2015-02-05favor IO#close_on_exec= over fcntl in 1.9+
IO#close_on_exec* methods are available since Ruby 1.9.1. It allows us to use less bytecode as it requires fewer operands and avoids constant lookups.
2015-02-05remove 1.8, <= 1.9.1 fallback for missing IO#autoclose=
We're requiring Ruby 1.9.3+, so we can safely depend on IO#autoclose= being available in 1.9+ and shave off some bloat.
2015-02-05socket_helper: reduce constant lookups and caching
In Ruby 1.9.2+, socket options may be specified using symbols instead of constants to avoid the need to import Socket::Constants into the namespace. This also has a nice side-effect of reducing the size of the bytecode by trading 3 instructions (getinlinecache, getconstant, setinlinecache) for one "putobject" instruction. Nowadays, we may also avoid defining OS-specific constants ourselves since 1.9+ versions of Ruby already provide them to further reduce bytecode size. getsockopt also returns Socket::Option objects in 1.9.2+, allowing us to avoid the larger "unpack('i')" method dispatch for an operand-free "int" method call. Finally, favor Object#nil? calls rather than "== nil" comparisons to reduce bytecode size even more. Since this code is only called at startup time, it does not benefit from inline caching of constant lookups in current mainline Ruby. Combined, these changes reduce YARV bytecode size by around 2K on a 64-bit system.
2015-02-04GNUmakefile: fix clean gem build + reduce build cruft
Ensure we have a NEWS file for building the gem beforehand. We don't need to polute lib/ with object files, either.
2015-02-04http: standalone require + reduction in binary size
This allows requiring just the C extension part of "unicorn_http", without requiring the rest of unicorn, allowing other HTTP servers using the same parser to be slimmer. On my x86-64 Debian 7.0 system: text data bss dec hex filename 44026 1976 488 46490 b59a lib/unicorn_http.so 43930 1976 456 46362 b51a lib/unicorn_http.so
2015-02-04remove old inetd+git examples and exec_cgi
While it was technically interesting and fun to tunnel arbitrary protocols over a semi-compliant Rack interface, nobody actually does it (and anybody who does can look in our git history). This was from back in 2009 when this was one of the few servers that could handle chunked uploads,were one of the few users of chunked uploads, nowadays everyone does it! (or do they? :) A newer version of exec_cgi.rb still lives on in the repository of yet another horribly-named server, but there's no point in bloating the installation footprint of somewhat popular server such as unicorn.
2015-01-28http: -Wshorten-64-to-32 warnings on clang
Tested on x86_64, clang version 3.5-1ubuntu1 (trunk) (LLVM 3.5) These warnings were introduced on commit 4b2782a926d8f131b1e7382be35e3abb77bf4be5 ("http: reduce parser from 72 to 56 bytes on 64-bit") and did not affect any releases. These length checks should not be necessary in reality because HTTP header sizes never come close to 4GB in size. Fixup a minor coding style (inherited from Mongrel) violation while we're at it (tabs => spaces).
2015-01-18use the monotonic clock under Ruby 2.1+
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.
2015-01-17gemspec: fixup olddoc migration
rdoc_options is no longer necesary with olddoc as olddoc can infer document titles and only generates cgit-compatible URLs to source code.
2015-01-10README: clarify/reduce references to unicorn_rails
unicorn_rails is an ancient compatibility wrapper for ancient versions of Rails which did not use Rack. Those applications have likely moved on, so stop promoting unicorn_rails.
2015-01-10switch docs + website to olddoc
wrongdoc was difficult to maintain because of the tidy-ffi dependency and the HTML5 changes in Darkfish could not be handled well by Tidy. olddoc is superior as it generates leaner HTML which loads faster, requires less scrolling and less processing power to render. Aesthetic comparisons are subjective of course but completely unimportant compared to speed and accessibility. The presence of images and CSS on the old (Darkfish-based) site probably set unreasonable expectations as to my ability and willingness to view such things. No more, the new website is entirely simple HTML which renders well with even the wimpiest browser.
2014-12-28tmpio: drop the "size" method
It is redundant given the existence of File#size in Ruby 1.9+ This saves 1440 bytes of bytecode on x86-64 under 2.2.0, and at least another 120 bytes for the method entry, hash table entry, and method definition overhead.
2014-12-21remove SSL support
We implemented barely-advertised support for SSL for two reasons: 1) to detect corruption on LANs beyond what TCP offers 2) to support other servers based on unicorn (never happened) Since this feature is largely not useful for unicorn itself, there's no reason to penalize unicorn 5.x users with bloat. In our defense, SSL support appeared in version 4.2.0 :)
2014-12-21t/t0002-parser-error.sh: relax test for rack 1.6.0
This overly zealous test was broken by: rack commit be28c6a2ac152fe4adfbef71f3db9f4200df89e8 ("update HTTP status codes to IETF RFC 7231")
2014-11-27http_server: save 450+ bytes of memory on x86-64
Replacing the Regexp argument to a rarely-called String#split with a literal String can save a little memory. The removed Regexp memsize is 469 bytes on Ruby 2.1: ObjectSpace.memsize_of(/,/) => 469 Is slightly smaller at 453 bytes on 2.2.0dev (r48474). These numbers do not include the 40-byte object overhead. Nevertheless, this is a waste for non-performance-critical code during the socket inheritance phase. A literal string has less overhead at 88 bytes: * 48 bytes for table entry in the frozen string table * 40 bytes for the object itself The downside of using a literal string for the String#split argument is a 40-byte string object gets allocated on every call, but this piece of code is only called once in a process lifetime.
2014-11-01worker: remove old tmp accessor
This has not been used since unicorn 4.0.0 over three years ago. This is an incompatible change, but hopefully nobody uses this in before_fork/after_fork hooks anywhere.
2014-10-04examples: add run_once to before_fork hook example
There may be code in a before_fork hook which should run only once, document an example using a guard variable since it may not be immediately obvious to all users. Inspired-by: BrĂ¡ulio Bhavamitra <braulio@eita.org.br> http://bogomips.org/unicorn-public/m/20141004015707.GA1951@dcvr.yhbt.net.html
2014-09-17http: reduce parser from 72 to 56 bytes on 64-bit
This allows the parser struct to fit in one cache line on x86-64 systems where cache lines are 64 bytes. Using 32-bit integer lengths is safe here because these are only for tracking offsets within the HTTP header buffer. We can safely limit HTTP headers and in-memory buffers to be less than 4GB without anybody complaining. HTTP bodies continue to use off_t (usually 64-bit, even on 32-bit systems) sizes and support as much as the OS/hardware can handle.
2014-08-18http: remove the keepalive requests limit
This was a hack for some event loops such as those found in nginx and some Rainbows! concurrency models. Using epoll/kqueue with one-shot notification (which yahns does) avoids all fairness problems.
2014-08-18remove mongrel.rubyforge.org references
mongrel.rubyforge.org has been dead longer than rubyforge.org!
2014-08-17remove RubyForge and Freecode references
Both sites are gone.
2014-08-17http_response: remove Status: header
Whatever compatibility reasons which existed in 2009 likely do not exist now. Other servers (e.g. thin, puma) seem to work alright without it, so there's no reason to waste precious bytes.
2014-08-17unicorn.gemspec: depend on test-unit 3.0
test-unit 3 and minitest 5 will have equal support status as a bundled gems when Ruby 2.2.0 is released in December 2014. These bundled gems will appear in the user-oriented tarball installations, but do not get installed by "make install" when installing Ruby from SVN or git. test-unit appears to be actively maintained and good at keeping backwards compatibility even on a major version change, so this means no code changes on our end. I am not convinced switching to minitest is worth the effort. Cc: Ken Dreyer <ktdreyer@ktdreyer.com>
2014-08-17dev: remove isolate dependency
It seems unnecessary with current versions of RubyGems supporting development dependencies.
2014-07-03FAQ: add entry for Rails autoflush_log
Thanks to Cedric Maion for bringing this up on the mailing list: http://bogomips.org/unicorn-public/m/20140703144048.GA6674@cedric-maion.com
2014-05-29http: remove xftrust options
This has long been considered a mistake and not documented for very long. I considered removing X-Forwarded-Proto and X-Forwarded-SSL handling, too, so rack.url_scheme is always "http", but that might lead to compatibility issues in rare apps if Rack::Request#scheme is not used.
2014-05-29GIT-VERSION-GEN: start 5.0.0 development
Incompatible changes ahead!
2014-05-08ISSUES: update with mailing list subscription
mlmmj seems quite usable and maintainable, so we'll run it.
2014-05-07unicorn 4.8.3 - the end of an era v4.8.3
This release updates documentation to reflect the migration of the mailing list to a new public-inbox[1] instance. This is necessary due to the impending RubyForge shutdown on May 15, 2014. The public-inbox address is: unicorn-public@bogomips.org (no subscription required, plain text only) ssoma[2] git archives: git://bogomips.org/unicorn-public browser-friendly archives: http://bogomips.org/unicorn-public/ Using, getting help for, and contributing to unicorn will never require any of the following: 1) non-Free software (including SaaS) 2) registration or sign-in of any kind 3) a real identity (we accept mail from Mixmaster) 4) a graphical user interface Nowadays, plain-text email is the only ubiquitous platform which meets all our requirements for communication. There is also one small bugfix to handle premature grandparent death upon initial startup. Most users are unaffected. [1] policy: http://public-inbox.org/ - git://80x24.org/public-inbox an "archives first" approach to mailing lists [2] mechanism: http://ssoma.public-inbox.org/ - git://80x24.org/ssoma some sort of mail archiver (using git)