Etkinlik: Optimizing Resource Utilization for Ruby processes | Etkinlik kaydı eklendi!

Merhaba!

Akşam Oturmalarımızın onüçüncüsü ile sizler ile birlikteyiz. Bu oturmamızda Intercom’dan Murat Toygar Optimizing Resource Utilization for Ruby processes başlıklı sunumuyla bizlerle. Sunum dili Türkçe olacak ve sonrasında sorularımızı sorabileceğiz. Sonrasında vaktimiz kalırsa kendi aramızda sohbetimize devam edebiliriz.

Sunum başlığını biraz daha açabilir miyiz?

Ruby ile geliştirdiğiniz projeyi yayına aldınız ama RAM kullanımınız gittikçe artıyor mu? CPU yetmemeye mi başladı? Belki hata sizde değil, ondadır(configler). Bunun gibi bazı problemlerimizi ikinci makineyi açmadan, sunucuyu yeniden başlatmadan çözebiliriz. Nasıl mı, cevabı bu sunumda. :slight_smile:

Tamamen özgür bir ortamda Ruby ve bilgisayar bilimlerine dair konuları konuştuğumuz, yer yer gündemi değerlendirdiğimiz buluşmamıza sizi de bekleriz.

Görüşmek üzere.

Video kaydı:

Şöyle elden ele: https://twitter.com/ruby_turkiye/status/1540730272584503296

https://kommunity.com/ruby-turkiye/events/optimizing-resource-utilization-for-ruby-processes-c7be9b97

2 Beğeni

Etkinlik icin tekrar tesekkurler Murat’a. Hem bilgilendirici hem de dinlemesi oldukca keyifli bir sunumdu.

@yasar 'in ricasi uzerine, soru-cevap bolumunde paylastigim, gecen sene yasadigimiz problemi aciklayayim ben de konuyla ilgisi dolayisiyla. Ozellikle Murat’in konusmasinda paylastigi deneme / yanilma kismi ve etkileri bolumunde bahsettigi gibi process ve thread’lerin kaynaktan fazla olmasi durumunda neler oldugunu gostermesi acisindan faydali olabilir.

2021 yili ilk ceyregi sonlarinda web dynolarinda asagidaki gibi bir memory sorunuyla karsilasmaya basladik. Uygulama ilk ayaklandiginda bir sorun yasamiyor ancak ogle saatlerinde musterilerin uygulamayi kullanmaya baslamasi ile birlikte memory tuketimi bir anda tirmanip cokca “Error R14 (Memory quota exceeded)” olusturuyordu. Burada bahsetmem gerekir ki uygulamaya gelen istek sayisinda o donemlerde kayda deger bir degisiklik yoktu.

Detaylari gorebilmek icin Newrelic, Skylight ve Scout APM gibi toollar ile uygulamayi izledigimizde her bir islem icerisindeki memory kullanimi normal gorunuyor, leak olusturabilecek bir allocation bulunmuyordu.

Daha sonra tek tek son donemde yapilmis versiyon guncellemelerine bakarken Puma 4.3’den 5.2 gecis sirasinda Puma’nin davranisinin degistigini farkettik. Puma 5.0-Upgrade dokumaninda yazan memory sorunu bizim durumumuzda da yasanmis oldu.

Note: Puma 5 now automatically uses WEB_CONCURRENCY env var if set see this post for an explanation. If your memory use goes up after upgrading to Puma 5 it indicates you’re now running with multiple workers (processes). You can decrease memory use by tuning this number to be lower.

Eski versiyonda 1 worker 10 thread calisirken WEB_CONCURRENCY degiskenini worker olarak kullanmaya baslayinca bir anda 5 worker x 10 thread olarak ayaklanmaya basladi uygulama. Asagidaki Puma’nin 5.2 gecisimizle birlikte gonderdigi logu gorebilirsiniz

app/web.1 [3] Puma starting in cluster mode...
app/web.1 [3] * Puma version: 5.2.2 (ruby 3.0.0-p0) ("Fettisdagsbulle")
app/web.1 [3] *  Min threads: 10
app/web.1 [3] *  Max threads: 10
app/web.1 [3] *  Environment: production
app/web.1 [3] *   Master PID: 3
app/web.1 [3] *      Workers: 5
app/web.1 [3] *     Restarts: (✔) hot (✖) phased
app/web.1 [3] * Preloading application

5 worker x 10 thead 1 GB’lik 2X Heroku dyno’sunu doldurmak icin hayli yeterli bir sayi :slight_smile: Uygulamada bir anda memory artisi yasanmasinin sebebi, musteri gelisi sonrasi yeni worker ve threadlerin tetiklenmesi.

Worker (2) ve thread (5) duzenlemesi sonrasi memory kullanimi normale dondu. Bu noktadan sonra @mtoygar 'in dedigi gibi thread sayisini ufak ufak artirarak optimumu bulmaya calistik.

app/web.1 [4] Puma starting in cluster mode...
app/web.1 [4] * Puma version: 5.2.2 (ruby 3.0.0-p0) ("Fettisdagsbulle")
app/web.1 [4] *  Min threads: 5
app/web.1 [4] *  Max threads: 5
app/web.1 [4] *  Environment: production
app/web.1 [4] *   Master PID: 4
app/web.1 [4] *      Workers: 2
app/web.1 [4] *     Restarts: (✔) hot (✖) phased
app/web.1 [4] * Preloading application
3 Beğeni