我在运行ruby 2.3.3和Rails 4.1.13的Heroku上使用Rails应用程序时出现内存问题.当我在Heroku上加载应用程序时,它的启动速度约为430 Mb,但在那里相当稳定 - 但仍然在Heroku上达到512 Mb(正如预期的那样).我的主要问题是:如何在我的应用程序的BOOT期间精确定位并减少内存使用量?即我如何减少启动时使用的内存量?
我已经研究了大多数宝石,例如出轨,oink,内存分析器和stackprof,但是在找到内存膨胀和内存饥饿控制器等方面,最有帮助我的是Heroku上的Scout附加组件.通过这个我已经设法减少应用程序在内存方面增长的数量,但减少启动时使用的内存量.
我知道宝石是在启动时加载的,宝石越多,越大,启动时使用的内存就越多.跑步bundle exec derailed bundle:mem给了我这个:
TOP: 92.3008 MiB
carrierwave-aws: 16.7461 MiB
carrierwave/storage/aws: 16.6094 MiB
aws-sdk-core/s3: 7.9414 MiB
aws-sdk-resources: 2.5703 MiB
aws-sdk-core: 2.5117 MiB
jmespath: 1.8867 MiB
jmespath/nodes: 1.1406 MiB
jmespath/nodes/function: 0.3867 MiB
seahorse/client/base: 0.9414 MiB
seahorse/client/plugins/net_http: 0.5273 MiB
aws-sdk-core/xml/parser/engines/rexml: 0.8633 MiB
rexml/document: 0.8516 MiB
rexml/element: 0.5508 MiB
rails/all: 13.6992 MiB
rails: 8.9453 MiB (Also required by: active_record/railtie, active_model/railtie, and 6 others)
rails/application: 7.2188 MiB
rails/engine: 6.8672 MiB (Also required …Run Code Online (Sandbox Code Playgroud) 我有一个在Heroku上运行的应用程序,有时会报告Timeout :: Error和(ActionView :: Template :: Error)"执行过期".
这种情况发生在整个网站上(即不在特定的控制器中)所以我想创建一个能处理这两个错误的函数,首先重试两次并将用户重定向到一个页面,告诉他们服务器是忙.
我目前的计划是在ApplicationController中使用以下内容:
rescue_from Timeout::Error, :with => :rescue_from_timeout
def rescue_from_timeout
sleep 2
retry
end
Run Code Online (Sandbox Code Playgroud)
但这只是循环和循环.我想让它在两次尝试后破裂.我怎样才能做到这一点?
另外,如何处理"执行过期"的ActionView :: Template :: Error?我不想通过重试来挽救所有的ActionView :: Template :: Error,只会引发"执行过期".
这就是我的例外情况:
[Exception] home#index (ActionView::Template::Error) "execution expired"
Run Code Online (Sandbox Code Playgroud)
要么
[Exception] calculations#result (ActionView::Template::Error) "Timeout::Error: execution expired
Run Code Online (Sandbox Code Playgroud)
我的问题是:如何通过首先重试两次然后将异常/重定向到错误页面来处理这两种类型的错误?
我试着用Rails解决内存泄漏问题.我可以通过New Relic看到内存的使用量在增加而不会减少.
这是一个来自大线程(Rails应用程序内存不断增加)的衍生问题,我在解决问题时遇到了麻烦.我现在需要知道的只是:
Rails内存泄漏的主要原因/因素是什么?
据我所理解:
全局变量(例如@@ variable) - 我没有这些变量
符号(我没有特别创建)
会议 - 在这里应该避免什么?假设我有一个会话,跟踪一个特定用户在文本搜索网站时使用的最后一个查询.我该怎么杀掉它?
"留下参考资料" - 这究竟意味着什么?你举个例子吗?
您可以提供的任何其他错误的编码示例通常会造成内存泄漏?
我想用这些信息来查看我的代码,所以请提供示例!
最后,这会是"内存泄漏代码"吗?
ProductController
...
@last_products << Product.order("ASC").limit(5)
end
Run Code Online (Sandbox Code Playgroud)
这会让@last_products膨胀吗?
使用:Rails 3.2.11和Ruby 1.8.7
我在尝试label_tag输出html 时遇到了一些严重的问题.基本上它归结为:
<%= label_tag "This will <strong>not</strong> work!" %>
Run Code Online (Sandbox Code Playgroud)
我试过了:
<%= raw label_tag "This will <strong>not</strong> work!" %>
<%= label_tag raw "This will <strong>not</strong> work!" %>
<%= label_tag "This will <strong>not</strong> work!".html_safe %>
<%= (label_tag "This will <strong>not</strong> work!").html_safe %>
Run Code Online (Sandbox Code Playgroud)
我已经安装了gem'trail_xss'.
什么都行不通!
虽然我可以通过转义html找到很多相关的问题,其中人们遇到raw和html_safe问题,但是与label_tag无关.我无法使用f.label来解决这个问题.
这曾经用于相同的应用程序,但经过一些更新(其中Rails 3.0.3 - > 3.2.11是主要的)它停止工作.我没有注意到这发生的时间,所以我不确定是什么原因引起了这个问题.
你能复制一下吗?你有解决方案吗?
使用:Rails 3.1.1
我正在尝试在我的应用程序中创建一个搜索引擎,用于浏览大型数据库(大约 100 000 个项目)以进行字符串匹配。
我正在使用以下内容:
fp = FeededProduct.where("name LIKE '%blue%' OR description LIKE '%blue%' OR category LIKE '%blue%'")
Run Code Online (Sandbox Code Playgroud)
对于“blue”的搜索查询。
当我在 MySQL 中运行等效的搜索短语时,它工作正常,但是当我尝试在 rails 中运行它时,它显示:
NoMethodError: undefined method `fields' for nil:NilClass: SELECT `feeded_products`.* FROM `feeded_products` WHERE (name LIKE '%blue%' OR description LIKE '%blue%' OR category LIKE '%blue%')
Run Code Online (Sandbox Code Playgroud)
线索和故障排除:
这只发生在大型搜索结果中,我无法区分一个数字,但它在应该返回 920 个结果时崩溃,但在返回 6 个结果时它不会崩溃!
我对上述结论的结论要么是它无法将所有 920 个结果保留在内存中,要么是某种类型的行使其崩溃,结果越多,它就越有可能包含该类型的行。我更倾向于第一个结论。
我无法很好地对其进行故障排除,因为它在我尝试运行时崩溃(具有相同的错误代码):
raise fp.inspect
Run Code Online (Sandbox Code Playgroud)
它也会崩溃:
fp.each do |prod|
begin
puts 'Do nothing'
rescue
puts 'Something crashed'
end
Run Code Online (Sandbox Code Playgroud)
但它不会崩溃:
raise fp.count.inspect
Run Code Online (Sandbox Code Playgroud)
那么,我有记忆类型的问题吗?我该怎么做才能进一步解决这个问题和/或解决问题?
使用:Mac OS X …
使用 Rails 4.1.13 和 Ruby 2.0.0(虽然我在使用 Ralis 4.0 和 Ruby 1.9.3 时遇到了同样的问题。我已经阅读了许多关于这个特定问题的文章,但无法理解为什么我的解决方案(看起来完全像这样)没有工作,所以请帮助我。
我有两个模型 BlogPost 和 Tag。一个博客帖子可以有多个标签,一个标签可以有多个博客帖子。我通过第三个模型 BlogPostRelation 将它们连接起来。因此,这是我的基本设置:
# blog_post.rb
has_many :blog_post_tag_relations, dependent: :destroy
has_many :tags, :through => :blog_post_tag_relations
accepts_nested_attributes_for :blog_post_tag_relations, :tags
# tag.rb
has_many :blog_post_tag_relations, dependent: :destroy
has_many :blog_posts, :through => :blog_post_tag_relations
# blog_post_tag_relation.rb
belongs_to :tag
belongs_to :blog_post
validates_uniqueness_of :tag_id, :scope => [:blog_post_id]
validates :blog_post_id, :presence => true
validates :tag_id, :presence => true
accepts_nested_attributes_for :tag, :blog_post
Run Code Online (Sandbox Code Playgroud)
我有一个使用 Formtastic 的 BlogPost 表单,我在其中使用以下命令为 BlogPost 创建复选框:
<%= f.input :blog_title %> …Run Code Online (Sandbox Code Playgroud) 我已经在StackOverflow上阅读了关于InvalidAuthenticityToken和protect_from_forgery的多个问题和答案,但没有更明智.
我有一个网站每天都会收到数百个这样的错误.它们似乎主要(仅限于?)来自移动设备,但我只通过样本验证过.
我理解为什么有AuthenticityToken和添加的需要
<%= csrf_meta_tags %>
Run Code Online (Sandbox Code Playgroud)
在application.html(我有)以及在应用程序控制器中有protect_from_forgery.我有csrf_meta_tags和:
protect_from_forgery with: :exception
Run Code Online (Sandbox Code Playgroud)
在我的应用程序控制器中,默认情况下.
我意识到我可以通过删除protect_from_forgery来"解决"这个问题,但这会让我容易受到CSRF攻击,所以这不是真正的解决方案,是吗?对于发生的表单帖子,我可以为protect_from_forgery添加一个"except",但这会让我感到非常脆弱,对吧?
编辑:我尝试使用移动设备访问表单,禁用Cookie并遇到422错误.无法让它导致异常.为我的"结果"函数添加一个例外删除了,但这让我觉得它很脆弱?
Edit2:我在同一页面上有几个表单(例如搜索表单).也许这会影响这个问题?
我现在处于一个我无法拥有它的位置,因为它每天导致数百名用户出错,我无法将其删除,因为我担心它会使我的网站容易受到攻击.
那么,我该怎么办?有一个像样的中间地带?
有什么方法可以改变protect_from_forgery并仍然相信我不会被黑客破坏我的数据库吗?
我没有为网站使用任何API,并且所有错误都来自相同类型的表单.我知道这个问题有一个javascript部分但不是真的如何使用该信息来解决问题.
提前致谢!
我得到的异常示例:
An ActionController::InvalidAuthenticityToken occurred in calculations#result:
ActionController::InvalidAuthenticityToken
-------------------------------
Request:
-------------------------------
* URL : http://www.example.com/calculation/result
* HTTP Method: PUT
* IP address : 217.214.148.251
* Parameters : {"utf8"=>"?", "_method"=>"put", "authenticity_token"=>"udnClerrF5UWvg84uaD82TzmPx/vWssv2wN9UPqyn10UwXqbOwa2FBtnZ5Nfo7HPh9xbA2OSrrUNineW50XiYg==", "commit"=>"Calculate", "controller"=>"calculations", "action"=>"result", "id"=>"123"}
* Timestamp : 2016-08-19 12:11:09 UTC
* Server : 2696e83c-1538-434d-ab6d-4e16577698d0
* Rails root : /app
* Process: 6
-------------------------------
Session:
-------------------------------
* session id: "42b36aacc78102605cb3365922a550b1"
* data: {"session_id"=>"42b36aacc78102605cb3365922a550b1", …Run Code Online (Sandbox Code Playgroud) 我想制作一个脚本:
使用Google Map API。手动操作非常容易,但是可以使用API吗?我只能看到如何将Google Map添加到您的网站,以及它的喜欢之处。
比方说,例如,我想每天绘制一张美国的武装抢劫地图。我有一个CSV文件,其中包含所有位置(如Lon / Lat)。我想在凌晨0.01点创建一个可以在社交媒体上共享的地图(例如,使用Twitter API共享该地图的位置)。我不想在此过程中使用网站。
这可能吗?我怎样才能做到这一点?我正在使用Ruby on Rails,但现在我更感兴趣的是了解如何在任何脚本或伪代码中完成此操作。
我刚刚完成了一个Rails应用程序,我现在要将其上传到Web.这是对现有应用程序的重写,我预计每天会有大约4 000名访问者,有时会达到每天10 000个峰值.
我正在考虑三种方法:
使用Heroku
使用VPS Windows服务器
使用VPS Ubuntu服务器
你能帮我指点一下吗?Windows服务器对Rails真的不好吗?
我有三个数据库:
每个都定义在database.yml
我使用A( mynewapp_psql) 作为我的新应用程序的数据库。在此应用程序中,我希望能够从两个旧数据库中复制选定的材料。
我的尝试(根据回复更新)
old_db = ActiveRecord::Base.establish_connection(:database => 'old_blogposts_mysql'... etc)
posts = old_db.connection.execute("select * from posts'")
posts.each do |p|
NewPost.create(:name => p.name.downcase) #NewPost should add Post in A. (mynewapp_psql)
end
Run Code Online (Sandbox Code Playgroud)
它应该从我的旧数据库中获取每个产品,并在新数据库中创建一个新的等效产品。
我真的更喜欢通过控制台来完成此操作,并且我无法直接复制数据库,因为我需要过滤和更改数据。
ruby-on-rails ×10
memory ×2
database ×1
deployment ×1
heroku ×1
label ×1
memory-leaks ×1
nested-forms ×1
ruby ×1
timeout ×1