خطای fork: Cannot allocate memory در اجرای اسکریپت

سلام دوستان

یه اسکریپت کوچیکی نوشتم برای دانلود ویدیو از یوتیوب و آپلود فیلم تو تلگرام پروژه حدودا یک هفته ست که ران شده ( حدود ۱۰۰ تا مصرف کننده هم از اخرین امار در آوردم )

حالا مشکلی که هست اینه که این اسکریپت به صورت فجیعی رم استفاده میکنه ( با این که یک کد سادست ) و باعث میشه سرور ارور fork: Cannot allocate memory رو بده

میخواستم بدونم چجوری این مشکل رو حل کنم ، احساس میکنم کتاب خونه های که استفاده میکنم از رم برای ذخیره سازی استفاده میکنن ( وگرنه غیر طبیعی هست که برای ۱۰۰ تا کاربر همچین مشکلی پیش بیاد )

یه نمونه از کد یوتیوب :

  if is_youtube? message.text 
				video_id = parse_youtube(message.text)
				video = YoutubeDL::Video.new(message.text)
				formats=video.formats.map { |x|  x[:format]+'-'+x[:ext] }
				answers =
				Telegram::Bot::Types::ReplyKeyboardMarkup
				.new(keyboard: formats.each_slice(3).to_a.reverse, one_time_keyboard: true)
				bot.api.sendMessage(chat_id: message.chat.id, text: "لطفا نوع کیفیت خود را انتخاب کنید",reply_markup: answers)
				bot.listen do |q|
					unless formats.include?(q.text)
						bot.api.sendMessage(chat_id: q.chat.id, text: "فرمت نامعتبر است",reply_to_message_id: q.message_id)
						break
					end
					bot.api.sendMessage(chat_id: q.chat.id, text: "فایل شما در حال آماده سازی میباشد ...")
					video.options.configure do |c|
						c.get_filename = true
						c.format=q.text.to_i
					  end
					video.download
					unless video.format_note == 'DASH audio'
						bot.api.sendVideo(chat_id: message.chat.id, video: Faraday::UploadIO.new("./#{video.filename}",'video'),duration: video.duration,caption: video.title.to_s + ' @idownload_bot',text: video.description.to_s+ ' @idownload_bot')
						
						FileUtils.rm("./#{video.filename}")
					else
						bot.api.sendAudio(chat_id: message.chat.id, audio: Faraday::UploadIO.new("./#{video.filename}",'audio'),caption: video.title.to_s + ' @idownload_bot',duration: video.duration,title: video.title.to_s)
						FileUtils.rm("./#{video.filename}")
					end
					
					break
				end

کتاب خونه های استفاده شده :

gem 'telegram-bot-ruby', '~> 0.6'
gem 'sqlite3'
gem 'sequel'
gem 'yt'
gem 'youtube-dl.rb'
gem 'faraday', '0.9.2'
gem 'logging'
gem 'twitter'

nokogiri

گراف سرور

@samdvr
@lxsameer

سلام،
یکم کدو ساده تر کن، مثلا بعضی چزا رو بزار توی متد دیگه بعد اول بنچمارک بزن ببین کجا بیشتر رم میکشه دقیقا

2 پسندیده

سلام دوست عزیز.
نیازی به منشن کردن نیست دوستان به محض اینکه بتونن جواب می دن.
رم این سرور چقدر هست ؟

1 پسندیده

توی یه فایل جدا
از تابع newrelic_rpm از ولاس memorySampler استفاده کن ببین دقیقا چه runtime هایی باعث cause شدن

البته می تونی با فراخوانی سیستم به ps مک این کار رو هم بکنی اگر بخوای وقت بیشتری بزاری البته

اون متد و توی یکی از فایل های gem کار بزار بعد فراخان کن یا به قولی invoke کن به صورت rss مقدار مصرفی مورد هایی که می خوای و بهت میده

1 پسندیده

رم سرور ۲ با cpu ۲

1 پسندیده

ممکنه video.download رم زیادی ببره؟ مثلا برای بافر‌کردن video

2 پسندیده

دقیقا منم داشتم به همین فک میکردم

اما میگم شاید اپلود و دانلود این کار رو انجام میده
باعث میشه

نوع ویدیو هم مهمه ایا مثلا کیفیت و نوعش

2 پسندیده

@toomaj @JARVIS
یعنی منظورتون این که ویدیو رو تو بافر نگه میداره اگر این باشه که خیلی احمقانه ساخته شده

نمیدونم راستش، باید gem ببینم، اما با حدس و گمان رندم به نتیجه نمیرسیم، باید بنچمارک بشه، البته دلیل من برای این حدس این بود که امار همه چیز به جز رم پایین بود بخصوص IO، بعد IO یه جایی یدفعه بالا رفته


فکر نکنم مشکلی از download باشه

1 پسندیده

چرا از‌ روش زیر استفاده نشده؟

YoutubeDL.download "https://www.youtube.com/watch?v=gvdf5n-zI14", output: 'some_file.mp4'
1 پسندیده

چون تو بات از کاربر میپرسم چه کیفیتی میخوای ! ( و برای اینکه بفهمم چه فرمت های وجود داره باید از new استفاده کنم تا ویدیو رو دانلود نکنم)

با options نمیشه میشه مدیریتش کرد؟

سعی میکنم روش کار کنم ببینم چی میشه تا فردا اگر بتونم، باید این کارو خودم انجام بدم چون بنظر ساده میاد اما connection زیاد داره

نکته دیگه هم اینه که فایل باینری youtube-dl باید بنچمارک بشه، فکر نمیکنم اشکال از wrapper روبی باشه، با ssh ببینید بیشترین ram کدوم پروسه گرفته

من لیست فرمت هارو میخوام نمی تونم از متد دانلود استفاده کنم !
راستی همین الان سرور رو ریسایز کردم رمش به ۴ اپ شد
امار htop نشون میده بدون این که اسکریپت اجرا بشه ۹۰۰ مگابایت از رم رو مشغول کرده

فکر کنم جواب یوزر های الانم رو بده ولی ۱۰۰ درصد تو هفته های اتی به مشکلی بخورم

و تو جواب کامنت اخرتون خود کامند یوتیوب رو تو روبی تست کردم زمان تقریبیش با کد من برابر بود هیچ فرقی نمیکرد ولیکن htop چیزی در این باره نشونم نداد

الان یه ویدیوی که با رم ۲ نمیتونستم بگیرم رو با موفقیت تو تلگرام دریافت کردم

1 پسندیده

کامت بالا رو به تغییر دادم، با ssh چک کنید ببینید چی میشه

اینجوری باید مرطب به صورت افقی صعود کنید

برداشت من اینه که ویدئو بافر می شه کلا. برای اینکه مطمئن شی یه راهش اینه که پروشه دانلود ویدئو رو به یه پروسس دیگه انتقال بدی و فقط مموری اون پروسس رو ترک کنی.

1 پسندیده