استثناء الوظيفة: تم إنهاء JavaScript (إما بسبب انتهاء المهلة أو بشكل صريح)

لقد قمت للتو بنقل تثبيت أقدم من Discourse (الإصدار 1.9.0.beta5) إلى قطرة (Droplet) جديدة على Digital Ocean مع أحدث الإصدارات. نظرًا لقدم الإصدار القديم، لم أكن متأكدًا من أن كل شيء سينتقل بشكل صحيح، لكن يبدو أن كل شيء يعمل بشكل جيد.

باستثناء أنه ينهار كل بضع ساعات.

هذا هو سجل الأخطاء الذي حصلت عليه في الساعة 12:57 صباحًا اليوم:

الرسالة

استثناء المهمة: تم إنهاء JavaScript (إما بسبب انتهاء المهلة أو بشكل صريح)

مسار الاستدعاء (Backtrace)

/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/mini_racer-0.2.6/lib/mini_racer.rb:201:in `eval_unsafe' 
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/mini_racer-0.2.6/lib/mini_racer.rb:201:in `block (2 levels) in eval' 
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/mini_racer-0.2.6/lib/mini_racer.rb:307:in `timeout' 
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/mini_racer-0.2.6/lib/mini_racer.rb:200:in `block in eval' 
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/mini_racer-0.2.6/lib/mini_racer.rb:198:in `synchronize' 
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/mini_racer-0.2.6/lib/mini_racer.rb:198:in `eval' 
/var/www/discourse/lib/es6_module_transpiler/tilt/es6_module_transpiler_template.rb:122:in `block in module_transpile' 
/var/www/discourse/lib/es6_module_transpiler/tilt/es6_module_transpiler_template.rb:81:in `block in protect' 
/var/www/discourse/lib/es6_module_transpiler/tilt/es6_module_transpiler_template.rb:80:in `synchronize' 
/var/www/discourse/lib/es6_module_transpiler/tilt/es6_module_transpiler_template.rb:80:in `protect' 
/var/www/discourse/lib/es6_module_transpiler/tilt/es6_module_transpiler_template.rb:115:in `module_transpile' 
/var/www/discourse/lib/pretty_text.rb:42:in `apply_es6_file' 
/var/www/discourse/lib/pretty_text.rb:61:in `block in ctx_load_manifest' 
/var/www/discourse/lib/pretty_text.rb:58:in `each_line' 
/var/www/discourse/lib/pretty_text.rb:58:in `ctx_load_manifest' /var/www/discourse/lib/pretty_text.rb:83:in `create_es6_context' 
/var/www/discourse/lib/pretty_text.rb:124:in `block in v8' 
/var/www/discourse/lib/pretty_text.rb:122:in `synchronize' 
/var/www/discourse/lib/pretty_text.rb:122:in `v8' 
/var/www/discourse/lib/pretty_text.rb:144:in `block in markdown' 
/var/www/discourse/lib/pretty_text.rb:411:in `block in protect' 
/var/www/discourse/lib/pretty_text.rb:410:in `synchronize' 
/var/www/discourse/lib/pretty_text.rb:410:in `protect' 
/var/www/discourse/lib/pretty_text.rb:143:in `markdown' 
/var/www/discourse/lib/pretty_text.rb:257:in `cook' 
/var/www/discourse/app/models/post_analyzer.rb:33:in `cook' 
/var/www/discourse/app/models/post.rb:289:in `cook' 
/var/www/discourse/lib/cooked_post_processor.rb:30:in `initialize' 
/var/www/discourse/app/jobs/regular/process_post.rb:25:in `new' 
/var/www/discourse/app/jobs/regular/process_post.rb:25:in `execute' 
/var/www/discourse/app/jobs/base.rb:232:in `block (2 levels) in perform' 
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rails_multisite-2.0.7/lib/rails_multisite/connection_management.rb:63:in `with_connection' 
/var/www/discourse/app/jobs/base.rb:221:in `block in perform' 
/var/www/discourse/app/jobs/base.rb:217:in `each' 
/var/www/discourse/app/jobs/base.rb:217:in `perform' 
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/sidekiq-5.2.7/lib/sidekiq/processor.rb:192:in `execute_job' 
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/sidekiq-5.2.7/lib/sidekiq/processor.rb:165:in `block (2 levels) in process' 
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/sidekiq-5.2.7/lib/sidekiq/middleware/chain.rb:128:in `block in invoke' 
/var/www/discourse/lib/sidekiq/pausable.rb:138:in `call' 
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/sidekiq-5.2.7/lib/sidekiq/middleware/chain.rb:130:in `block in invoke' 
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/sidekiq-5.2.7/lib/sidekiq/middleware/chain.rb:133:in `invoke' 
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/sidekiq-5.2.7/lib/sidekiq/processor.rb:164:in `block in process' 
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/sidekiq-5.2.7/lib/sidekiq/processor.rb:137:in `block (6 levels) in dispatch' 
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/sidekiq-5.2.7/lib/sidekiq/job_retry.rb:109:in `local' 
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/sidekiq-5.2.7/lib/sidekiq/processor.rb:136:in `block (5 levels) in dispatch' 
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/sidekiq-5.2.7/lib/sidekiq.rb:37:in `block in <module:Sidekiq>' 
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/sidekiq-5.2.7/lib/sidekiq/processor.rb:132:in `block (4 levels) in dispatch' 
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/sidekiq-5.2.7/lib/sidekiq/processor.rb:250:in `stats' 
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/sidekiq-5.2.7/lib/sidekiq/processor.rb:127:in `block (3 levels) in dispatch' 
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/sidekiq-5.2.7/lib/sidekiq/job_logger.rb:8:in `call' 
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/sidekiq-5.2.7/lib/sidekiq/processor.rb:126:in `block (2 levels) in dispatch' 
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/sidekiq-5.2.7/lib/sidekiq/job_retry.rb:74:in `global' 
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/sidekiq-5.2.7/lib/sidekiq/processor.rb:125:in `block in dispatch' 
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/sidekiq-5.2.7/lib/sidekiq/logging.rb:48:in `with_context' 
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/sidekiq-5.2.7/lib/sidekiq/logging.rb:42:in `with_job_hash_context' 
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/sidekiq-5.2.7/lib/sidekiq/processor.rb:124:in `dispatch' 
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/sidekiq-5.2.7/lib/sidekiq/processor.rb:163:in `process' 
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/sidekiq-5.2.7/lib/sidekiq/processor.rb:83:in `process_one' 
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/sidekiq-5.2.7/lib/sidekiq/processor.rb:71:in `run' 
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/sidekiq-5.2.7/lib/sidekiq/util.rb:16:in `watchdog' 
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/sidekiq-5.2.7/lib/sidekiq/util.rb:25:in `block in safe_thread'

البيئة

|hostname|dow-18-app|
| --- | --- |
|process_id|8390|
|application_version|800e49f16e43e0783d30971e84a4e4619d448a7c|
|current_db|default|
|current_hostname|forum.driveonwood.com|
|job|Jobs::ProcessPost|
|problem_db|default|
||opts null

post_id 94118
--- ---
bypass_bump true
new_post false
current_site_id default|

كان الموقع غير مستجيب عندما حاولت تحميله هذا الصباح، وحصلت على خطأ 504. كان الخادم لا يزال يعمل، وأظهر السجل في ./launcher log app ما يلي بشكل متكرر:

ok: run: redis: (pid 48) 11912s
ok: run: postgres: (pid 47) 11912s
supervisor pid: 26654 unicorn pid: 26658
config/unicorn_launcher: line 71: kill: (26658) - No such process
config/unicorn_launcher: line 15: kill: (26658) - No such process
(26654) exiting

بعد إعادة التشغيل في الساعة 9 صباحًا، عمل الموقع بشكل جيد لبضع ساعات، ثم انهار مرة أخرى في الساعة 11:04 صباحًا. سجلات الأخطاء متشابهة إلى حد كبير في كلتا الحالتين. حل إعادة التشغيل مرة أخرى المشكلة (للمرة الحالية). سأتابع الأمر، وأعيد التشغيل عند الحاجة حتى أصل إلى حل لهذه المشكلة.

الموقع هنا: http://forum.driveonwood.com

هذا على الأرجح مرتبط بالحمولة، كيف يبدو أداء وحدة المعالجة المركزية (CPU) على خادمك؟ وكيف يبدو استخدام الذاكرة؟

يبدو أن الموقع مستقر منذ هذين الانهيارين. استهلاك المعالج والذاكرة طبيعي. لا أعرف كيف كانا خلال فترة التوقف. ربما كان هناك حمل ثقيل في البداية بسبب الانتقال.

سأقوم بتحديث هذا الموضوع إذا حدث أي شيء.

حدث تعطل للتو. أعدت تشغيل الخادم مرة أخرى، وهو يستخدم الآن 70-80% من وحدة المعالجة المركزية. يقوم بتحويل ملفات JPG لسبب ما، ولدينا الكثير من الصور. سأعيد التشغيل حسب الحاجة، وآمل أن تكون هذه مهمة لمرة واحدة.

تعطلت مرة أخرى اليوم. قبل إعادة التشغيل، لاحظت أن 97% من وحدة المعالجة المركزية مخصصة لهذه العملية:

ruby /var/www/discourse/vendor/bundle/ruby/2.6.0/bin/unicorn -E production -c config/unicorn.conf.rb

استخدام الذاكرة الإجمالي:

  3073648 كبايت إجمالي الذاكرة
  904712 كبايت ذاكرة مستخدمة
 1510576 كبايت ذاكرة نشطة
  376240 كبايت ذاكرة غير نشطة
  815448 كبايت ذاكرة حرة
  306872 كبايت ذاكرة عازلة
 1046616 كبايت ذاكرة تبديل مخزنة
       0 كبايت إجمالي ذاكرة التبديل
       0 كبايت ذاكرة تبديل مستخدمة
       0 كبايت ذاكرة تبديل حرة

هل لديك أي معلومات حول ما تفعله هذه العملية تحديدًا؟

تغيرت طريقة تخزين الصور منذ فترة، وهي الآن قيد المعالجة. توجد إجراءات مفترض أن تمنع حدوث تعطل، لكنها غير كافية في حالتك. أنصحك بزيادة ذاكرة الوصول العشوائي (RAM) مؤقتًا حتى تنتهي عملية المعالجة بالكامل.

أعتقد أن هناك إعدادًا في الموقع يتحكم في عدد الصور التي تُعالج في كل دفعة، لكنني لا أتذكره بالضبط في هذه اللحظة.

شكرًا لك. كنت أشك في شيء من هذا القبيل. لدينا 15 جيجابايت من الصور.

سأتابع الأمر، وأعيد التشغيل حسب الحاجة.

وبشكل أكثر تحديدًا، أصبح الآن مدعومًا سمة srcset على وسم <img>، مما يتيح لأجهزة ريتينا رؤية صور بدقة أعلى. وهذا يعني وجود نسخ إضافية من الصور كأثر جانبي، لأنك تحتاج إلى تقديم نفس الصورة بعدة كثافات عرض مختلفة.

انظر https://html.com/attributes/img-srcset/