CLI สำหรับการวิเคราะห์กองทับทิม ขอบคุณ Sam Saffron สำหรับแนวคิดและรหัสเริ่มต้น
เพิ่มบรรทัดนี้ใน Gemfile ของแอปพลิเคชันของคุณ:
gem 'heapy'
แล้วดำเนินการ:
$ bundle
หรือติดตั้งด้วยตัวเองเป็น:
$ gem install heapy
รันด้วยอินพุตสองอินพุตเพื่อส่งออกค่าของวันนี้
$ heapy diff tmp/yesterday.dump tmp/today_morning.dump
Allocated STRING 9991 objects of size 399640/491264 (in bytes) at: scratch.rb:24
รันด้วยอินพุตสามอินพุตเพื่อแสดงความแตกต่างระหว่างสองครั้งแรก แต่เฉพาะในกรณีที่วัตถุยังคงอยู่ในสาม
$ heapy diff tmp/yesterday.dump tmp/today_morning.dump tmp/today_afternoon.dump
Retained STRING 9991 objects of size 399640/491264 (in bytes) at: scratch.rb:24
# ...
ส่งผ่านชื่อของไฟล์เอาต์พุตและวัตถุที่มีอยู่ในวันนี้วันที่ไม่ได้อยู่ในเมื่อวานนี้จะถูกเขียนลงในไฟล์นั้น
$ heapy diff tmp/yesterday.dump tmp/today.dump --output_diff=output.json
Allocated STRING 9991 objects of size 399640/491264 (in bytes) at: scratch.rb:24
# ...
Writing heap dump diff to output.json
เนื่องจากวิธีการที่นักสะสมขยะใน MRI จัดการวัตถุบนกองทับทิมฮีป heapy diff
อาจสร้างความแตกต่างที่ไม่สมบูรณ์หรือไม่ถูกต้องภายใต้สถานการณ์ต่อไปนี้:
GC.compact
หรือเปิดใช้งานการคำนวณอัตโนมัติฮีปซีไม่สามารถสร้างความแตกต่างที่แม่นยำได้เนื่องจากวัตถุอาจเคลื่อนย้ายไปยังสล็อตฮีปที่แตกต่างกันและจะปรากฏขึ้นใหม่แม้ว่าพวกเขาจะไม่ได้ โดยทั่วไปกลไกใด ๆ ที่เคลื่อนย้ายวัตถุที่มีอยู่จากช่องหนึ่งฮีปไปยังอีกช่องหนึ่งจะทำให้รายงาน DIFF เป็นโมฆะ ปิดการบดอัดเสมอก่อนที่จะใช้ <after>
กองกองกอง<after>
dump ถ้าทับทิมจัดสรรให้เป็นช่อง HEAP ที่ก่อนหน้านี้ถูกครอบครองโดยวัตถุที่แตกต่างกันใน <before>
การถ่ายโอนข้อมูลและจากนั้นจะจัดการระหว่างการทิ้งทั้งสอง เพื่อลดโอกาสในการเกิดเหตุการณ์นี้ให้เกิดการเรียกใช้ GC ที่สำคัญสามครั้งขึ้นไประหว่างการทิ้งกองสามารถช่วยให้ผู้รอดชีวิตและทำให้กองฮีปมีเสถียรภาพก่อนที่จะได้รับความแตกต่างขั้นตอนที่ 1) สร้างกองกอง คุณสามารถทำสิ่งนี้ได้ด้วยตนเอง หรือคุณสามารถใช้เครื่องมือเช่น derailed_benchmarks
ขั้นตอนที่ 2) เมื่อคุณมีกองกองคุณสามารถวิเคราะห์ได้โดยใช้ CLI นี้:
$ heapy read tmp/2015-10-01T10:18:59-05:00-heap.dump
Generation: nil object count: 209191
Generation: 14 object count: 407
Generation: 15 object count: 638
Generation: 16 object count: 748
Generation: 17 object count: 1023
Generation: 18 object count: 805
# ...
หมายเหตุ: เหตุผลที่คุณอาจได้รับการสร้าง "ไม่มี" คือวัตถุเหล่านี้ถูกโหลดลงในหน่วยความจำก่อนที่รหัสของคุณจะเริ่มติดตามการจัดสรร เพื่อให้แน่ใจว่าการจัดสรรทั้งหมดได้รับการติดตามคุณสามารถเรียกใช้สคริปต์ทับทิมของคุณเคล็ดลับนี้ได้ ก่อนอื่นสร้าง file trace.rb
ที่เริ่มการติดตามการจัดสรรเท่านั้น:
# trace.rb
require 'objspace'
ObjectSpace.trace_object_allocations_start
ตอนนี้ตรวจสอบให้แน่ใจว่าคำสั่งนี้โหลดก่อนที่จะเรียกใช้สคริปต์ของคุณคุณสามารถใช้ Ruby's -I
เพื่อระบุเส้นทางโหลดและ -r
เพื่อระบุไลบรารีที่ต้องการในกรณีนี้ไฟล์ติดตามของเรา
$ ruby -I ./ -r trace script_name.rb
หากบรรทัดสุดท้ายของไฟล์ของคุณไม่ถูกต้อง JSON ตรวจสอบให้แน่ใจว่าคุณกำลังปิดไฟล์หลังจากเขียน Ruby Heap Dump ลงไป
คุณสามารถเจาะลึกลงไปในรุ่นที่เฉพาะเจาะจง ในตัวอย่างก่อนหน้านี้รุ่น 17 'มีขนาดใหญ่แปลก ๆ คุณสามารถเจาะเข้าไปได้:
$ heapy read tmp/2015-10-01T10:18:59-05:00-heap.dump 17
Analyzing Heap (Generation: 17)
-------------------------------
allocated by memory (44061517) (in bytes)
==============================
39908512 /app/vendor/ruby-2.2.3/lib/ruby/2.2.0/timeout.rb:79
1284993 /app/vendor/ruby-2.2.3/lib/ruby/2.2.0/openssl/buffering.rb:182
201068 /app/vendor/bundle/ruby/2.2.0/gems/json-1.8.3/lib/json/common.rb:223
189272 /app/vendor/bundle/ruby/2.2.0/gems/newrelic_rpm-3.13.2.302/lib/new_relic/agent/stats_engine/stats_hash.rb:39
172531 /app/vendor/ruby-2.2.3/lib/ruby/2.2.0/net/http/header.rb:172
92200 /app/vendor/bundle/ruby/2.2.0/gems/activesupport-4.2.3/lib/active_support/core_ext/numeric/conversions.rb:131
คุณสามารถ จำกัด เอาต์พุตได้โดยผ่านค่า --lines
เส้น:
$ heapy read tmp/2015-10-01T10:18:59-05:00-heap.dump 17 --lines=6
หมายเหตุ: ค่าบรรทัดเริ่มต้นคือ 50
หากคุณต้องการอ่านทุกรุ่นคุณสามารถใช้คำสั่ง "ทั้งหมด"
$ heapy read tmp/2015-10-01T10:18:59-05:00-heap.dump all
นอกจากนี้คุณยังสามารถใช้เครื่องวิเคราะห์กอง JS ออนไลน์ของ T-LO สำหรับการสร้างภาพข้อมูล เครื่องมืออีกอย่างคือ HARB
หลังจากตรวจสอบ repo ให้เรียกใช้ $ bundle install
เพื่อติดตั้งการพึ่งพา จากนั้นเรียกใช้ rake spec
เพื่อเรียกใช้การทดสอบ
ในการติดตั้งอัญมณีนี้ลงบนเครื่องในเครื่องของคุณให้เรียกใช้ bundle exec rake install
หากต้องการเปิดตัวเวอร์ชันใหม่ให้อัปเดตหมายเลขเวอร์ชันใน version.rb
จากนั้นเรียกใช้ bundle exec rake release
ซึ่งจะสร้างแท็ก GIT สำหรับเวอร์ชันกด GIT และแท็กและกดไฟล์ .gem
ไปที่ rubygems.org
รายงานข้อผิดพลาดและคำขอดึงยินดีต้อนรับบน GitHub ที่ https://github.com/schneems/heapy โครงการนี้มีจุดประสงค์เพื่อเป็นพื้นที่ที่ปลอดภัยและเป็นมิตรสำหรับการทำงานร่วมกันและผู้สนับสนุนคาดว่าจะปฏิบัติตามจรรยาบรรณของผู้สนับสนุน
อัญมณีมีให้เป็นโอเพ่นซอร์สภายใต้ข้อกำหนดของใบอนุญาต MIT