Issue #15082 has been updated by alexis (Alexis Bernard).
I kept to investigate the memory leak issue. It seems it comes when OpenSSL::SSL::VERIFY_PEER is enabled and a ca_file is specified :
~~~ ruby
require "net/http"
require "openssl"
def repeat_https_get
uri = URI("https://example.com/")
http = Net::HTTP.new(uri.host, uri.port)
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
http.ca_file = "certdata.pem" # Download https://curl.haxx.se/ca/cacert.pem
http.use_ssl = true
loop { http.request(Net::HTTP::Get.new(uri.path)) }
end
repeat_https_get
~~~
The VmRSS of the Ruby process grows endlessly. Unfortunately MemoryProfiler does not report any retained memory.
----------------------------------------
Bug #15082: Memory leak in net/http/response and net/http/header
https://bugs.ruby-lang.org/issues/15082#change-74070
* Author: alexis (Alexis Bernard)
* Status: Open
* Priority: Normal
* Assignee:
* Target version:
* ruby -v: ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]
* Backport: 2.3: UNKNOWN, 2.4: UNKNOWN, 2.5: UNKNOWN
----------------------------------------
Hello,
I'm observing a memory leak in net/http with the following script :
~~~
require "net/http"
require "bundler/inline"
gemfile do
gem "memory_profiler"
end
def profile_http_get(n)
uri = URI("http://www.ruby-lang.org/fr/")
http = Net::HTTP.new(uri.host, uri.port)
report = MemoryProfiler.report do
n.times { http.request(Net::HTTP::Get.new(uri.path)) }
end
report.pretty_print
end
~~~
Here is the MemoryProfiler report when n is 10 :
~~~
retained memory by gem
-----------------------------------
4591 net
retained memory by file
-----------------------------------
4005 /home/alexis/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/net/http/response.rb
586 /home/alexis/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/net/http/header.rb
retained memory by location
-----------------------------------
2048 /home/alexis/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/net/http/response.rb:55
1917 /home/alexis/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/net/http/response.rb:62
520 /home/alexis/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/net/http/header.rb:83
66 /home/alexis/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/net/http/header.rb:68
40 /home/alexis/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/net/http/response.rb:43
retained memory by class
-----------------------------------
4591 String
retained objects by gem
-----------------------------------
67 net
retained objects by file
-----------------------------------
53 /home/alexis/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/net/http/response.rb
14 /home/alexis/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/net/http/header.rb
retained objects by location
-----------------------------------
27 /home/alexis/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/net/http/response.rb:55
25 /home/alexis/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/net/http/response.rb:62
13 /home/alexis/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/net/http/header.rb:83
1 /home/alexis/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/net/http/header.rb:68
1 /home/alexis/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/net/http/response.rb:43
retained objects by class
-----------------------------------
67 String
~~~
When n is 20 :
~~~
retained memory by gem
-----------------------------------
8229 net
retained memory by file
-----------------------------------
7217 /home/alexis/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/net/http/response.rb
1012 /home/alexis/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/net/http/header.rb
retained memory by location
-----------------------------------
3654 /home/alexis/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/net/http/response.rb:55
3523 /home/alexis/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/net/http/response.rb:62
880 /home/alexis/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/net/http/header.rb:83
66 /home/alexis/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/net/http/header.rb:68
66 /home/alexis/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/net/http/header.rb:86
40 /home/alexis/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/net/http/response.rb:43
retained memory by class
-----------------------------------
8229 String
retained objects by gem
-----------------------------------
119 net
retained objects by file
-----------------------------------
95 /home/alexis/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/net/http/response.rb
24 /home/alexis/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/net/http/header.rb
retained objects by location
-----------------------------------
48 /home/alexis/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/net/http/response.rb:55
46 /home/alexis/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/net/http/response.rb:62
22 /home/alexis/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/net/http/header.rb:83
1 /home/alexis/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/net/http/header.rb:68
1 /home/alexis/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/net/http/header.rb:86
1 /home/alexis/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/net/http/response.rb:43
retained objects by class
-----------------------------------
119 String
~~~
--
https://bugs.ruby-lang.org/
Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>