Memory constantly increasing in Rails app

前端 未结 2 1616
夕颜
夕颜 2021-02-04 11:53

I recently launched a new Ruby on Rails application that worked well in development mode. After the launch I have been experiencing the memory being used is constantly increasin

2条回答
  •  滥情空心
    2021-02-04 12:33

    That's unlikely our related_feed_categories provoke this.

    Are you using a lot of files ?

    How long do you keep sessions datas ? Looks like you have an e-commerce site, are you keeping objects in sessions ?

    Basically, i think it is files, or session, or an increase in temporary datas flushed when the server crash(memcache ?).

    In the middle of the night, i guess that ou have fewer customer. Can you post the same memory chart, in peak hours ?

    It may be related to this problem : Memory grows indefinitely in an empty Rails app

    UPDATE :

    Rails don't store all the datas on client side. I don't remember the default store, bu unless you choose the cookie::store, rails send only datas like session_id.

    They are few guidelines about sessions, the ActiveRecord::SessionStore seem to be the best choice for performance purpose. And you shouldn't keep large objects nor secrets datas in sessions. More on session here : http://guides.rubyonrails.org/security.html#what-are-sessions

    In the 2.9 part, you have an explanation to destroy sessions, unused for a certain time.

    Instead of storing objects in sessions, i suggest you store the url giving the search results. You may even store it in database, offering the possibility to save few research to your customer, and/or by default load the last used.

    But at these stage we are still, not totally sure that sessions are the culprits. In order to be sure, you may try on a test server, to stress test your application, with expiring sessions. So basically, you create a large number of sessions, and maybe 20 min later rails has to suppress them. If you find any difference in memory consumption, it will narrow things.

    First case : memory drop significantly when sessions expires, you know that's is session related.

    Second case : The memory increase at a faster rate, but don't drop when sessions expires, you know that it is user related, but not session related.

    Third case : nothing change(memory increase at usual), so you know it do not depend on the number of user. But i don't know what could cause this.

    When i said stress tests, i mean a significant number of sessions, not really a stress test. The number of sessions you need, depends on your average numbers of users. If you had 50 users, before your app crashed, 20 -30 sessions may be sginificant. So if you had them by hand, configure a higher expire time limit. We are just looking for differences in memory comsuption.

    Update 2 :

    So this is most likely a memory leak. So use object space, it has a count_objects method, which will display all the objets currently used. It should narrow things. Use it when memory have already increased a lot.

    Otherwise, you have bleak_house, a gem able to find memory leaks, still ruby tools for memory leaks are not as efficient as java ones, but it's worth a try.

    Github : https://github.com/evan/bleak_house

    Update 3 :

    This may be an explanation, this is not really memory leak, but it grows memory : http://www.tricksonrails.com/2010/06/avoid-memory-leaks-in-ruby-rails-code-and-protect-against-denial-of-service/

    In short, symbols are keep in memory until your restart ruby. So if symbols are created with random name, memory will grow, until your app crash. This don't happen with Strings, the are GCed.

    Bit old, but valid for ruby 1.9.x Try this : Symbol.all_symbols.size

    Update 4:

    So, your symbols are probably the memory leak. Now we still have to find where it occurs. Use Symbol.all_symbols. It gives you the list. I guess you may store this somewhere, and make a diff with the new array, in order to see what was added.

    It may be i18n, or it may be something else generating in an implicit way like i18n. But anyway, this is probably generating symbols with random data in the name. And then these symbols are never used again.

提交回复
热议问题