Skip to main content
  1. Posts/

Rekomendasi Performance Tuning Phusion Passenger

·5 mins·
Table of Contents

Untuk melakukan performance tuning pada Passenger, terdapat beberapa pengaturan yang umum digunakan dan dapat Anda sesuaikan dengan kapasitas server serta karakteristik aplikasi.

Perintah-perintah ini biasanya ditempatkan di dalam blok http, server, atau location pada file konfigurasi Nginx (biasanya /etc/nginx/nginx.conf atau conf.d/passenger.conf).

Manajemen Resource Sistem (File Descriptors)
#

Mencegah error “too many open files” saat trafik tinggi.

  • passenger_core_file_descriptor_ulimit <integer>;
    • Context: http
    • Fungsi: Mengatur batas file descriptor (ulimit) untuk proses inti Passenger.
    • Tuning: Tingkatkan nilai ini jika Anda sering melihat error “too many file descriptors” pada log sistem.
  • passenger_app_file_descriptor_ulimit <integer>;
    • Context: http, server, location
    • Fungsi: Mengatur batas file descriptor khusus untuk proses aplikasi.
    • Tuning: Gunakan ini jika error berasal dari proses aplikasi, bukan proses inti Passenger.

Manajemen Proses & Pooling
#

Mengontrol jumlah proses aplikasi untuk menyeimbangkan penggunaan memori dan kemampuan menangani concurrent requests.

  • passenger_max_pool_size <integer>; (Default: 6)
    • Context: http
    • Fungsi: Jumlah maksimum total proses aplikasi yang boleh berjalan secara bersamaan.
    • Tuning: Tingkatkan nilai ini untuk menangani lebih banyak request konkuren (membutuhkan lebih banyak RAM). Turunkan jika server kekurangan memori.
  • passenger_min_instances <integer>; (Default: 1)
    • Context: http, server, location
    • Fungsi: Jumlah minimum proses yang harus tetap hidup untuk sebuah aplikasi.
    • Tuning: Atur ke nilai > 0 (misalnya 3 atau 5) untuk menghindari delay saat pengunjung pertama kali mengakses aplikasi yang sedang idle.
  • passenger_max_instances <integer>; (Default: 0 / Unlimited)
    • Context: http, server, location
    • Fungsi: Membatasi jumlah maksimum proses untuk satu aplikasi tertentu (per-virtual host).
    • Tuning: Gunakan ini jika Anda meng-hosting banyak aplikasi di satu server untuk mencegah satu aplikasi memonopoli seluruh pool.
  • passenger_max_instances_per_app <integer>; (Default: 0)
    • Context: http
    • Fungsi: Mirip dengan di atas, tetapi berlaku global untuk semua aplikasi.
  • passenger_pool_idle_time <seconds>; (Default: 300)
    • Context: http
    • Fungsi: Waktu (dalam detik) proses aplikasi dibiarkan idle sebelum dimatikan untuk menghemat memori.
    • Tuning: Set ke 0 agar proses tidak pernah dimatikan (disarankan untuk server dedicated agar response selalu cepat). Perkecil nilainya untuk menghemat RAM.

Concurrency & Threading
#

Mengoptimalkan cara aplikasi menangani request (khususnya Ruby).

  • passenger_concurrency_model process|thread; (Default: process)
    • Context: http, server, location
    • Fungsi: Menentukan model konkurensi.
    • Tuning: Gunakan thread untuk penggunaan memori yang lebih efisien jika aplikasi Anda thread-safe.
  • passenger_thread_count <integer>; (Default: 1)
    • Context: http, server, location
    • Fungsi: Jumlah thread per proses (hanya berlaku jika passenger_concurrency_model diset ke thread).
    • Tuning: Tingkatkan nilai ini (misal 5-20) untuk meningkatkan kapasitas request per proses.
  • passenger_force_max_concurrent_requests_per_process <number>; (Default: -1)
    • Context: http, server, location
    • Fungsi: Memaksa Passenger menganggap aplikasi bisa menangani jumlah request konkuren tertentu per proses.
    • Tuning: Set ke 0 untuk aplikasi Ruby yang menggunakan WebSockets/SSE. Set ke angka tertentu untuk membantu dynamic process scaling.

Startup & Preloading
#

Mengurangi waktu loading saat aplikasi pertama kali diakses.

  • passenger_pre_start <url>;
    • Context: http
    • Fungsi: Memaksa aplikasi untuk start saat Nginx dimulai, bukan menunggu request pertama.
    • Tuning: Sangat disarankan digabungkan dengan passenger_min_instances. Contoh: passenger_pre_start http://example.com/;
  • passenger_max_preloader_idle_time <seconds>; (Default: 300)
    • Context: http, server, location
    • Fungsi: Waktu idle sebelum proses preloader dimatikan.
    • Tuning: Set ke 0 atau nilai tinggi agar proses spawning berikutnya jauh lebih cepat.

Queueing & Connection Handling
#

Mengatur antrian request saat server penuh.

  • passenger_max_request_queue_size <integer>; (Default: 100)
    • Context: http, server, location
    • Fungsi: Maksimum jumlah request yang bisa mengantri di dalam Passenger.
    • Tuning: Jika antrian penuh, request baru akan langsung error 503. Tingkatkan nilai ini untuk menahan lonjakan trafik jangka pendek (burst), atau set ke 0 untuk tidak terbatas.
  • passenger_max_request_queue_time <seconds>; (Default: 0)
    • Context: http, server, location
    • Fungsi: Maksimum waktu request boleh mengantri.
    • Tuning: Set ke nilai (misal 30) agar pengunjung tidak menunggu terlalu lama; jika lewat batas, akan muncul error 504.
  • passenger_socket_backlog <size>; (Default: 2048)
    • Context: http
    • Fungsi: Ukuran antrian koneksi socket dari Nginx ke Passenger.
    • Tuning: Tingkatkan nilai ini jika Anda mengubah worker_connections di Nginx ke nilai yang sangat tinggi untuk mencegah error “Resource temporarily unavailable”.
  • passenger_app_connect_timeout <integer>; (Default: 30)
    • Context: http, server, location
    • Fungsi: Waktu tunggu maksimal Passenger mencoba terhubung ke socket aplikasi.

Caching & I/O
#

  • passenger_turbocaching on|off; (Default: on)
    • Context: http
    • Fungsi: Mengaktifkan atau menonaktifkan cache respons kecil.
    • Tuning: Biarkan on untuk performa terbaik, matikan (off) jika membutuhkan kontrol cache yang sangat spesifik atau dinamis sepenuhnya.
  • passenger_stat_throttle_rate <seconds>; (Default: 10)
    • Context: http, server, location
    • Fungsi: Mengurangi frekuensi pengecekan file sistem (seperti restart.txt).
    • Tuning: Tingkatkan nilainya jika aplikasi berada di storage NFS atau disk I/O yang lambat untuk mengurangi beban server.
  • passenger_response_buffer_high_watermark <bytes>; (Default: 134217728 / 128MB)
    • Context: http, server, location
    • Fungsi: Ukuran buffer untuk respons aplikasi.
    • Tuning: Turunkan nilai ini jika Anda ingin mendeteksi client disconnect lebih cepat saat streaming data besar.

Contoh Konfigurasi Gabungan (Snippet)
#

Berikut adalah contoh penerapan tuning untuk server dengan trafik tinggi dan memori cukup:

Nginx:

http {
    # 1. Global Resource Limits
    passenger_core_file_descriptor_ulimit 65535;
    
    # 2. Pooling: Siapkan lebih banyak proses, jangan biarkan mati
    passenger_max_pool_size 30;          # Sesuaikan dengan RAM
    passenger_min_instances 5;           # Selalu siapkan 5 proses
    passenger_pool_idle_time 0;          # Proses tidak pernah dimatikan karena idle
    
    # 3. Queueing: Tahan lonjakan trafik
    passenger_max_request_queue_size 200; # Antrian lebih banyak
    passenger_max_request_queue_time 60;  # Maksimal antri 60 detik
    
    # 4. I/O Optimization
    passenger_stat_throttle_rate 30;     # Kurangi cek disk
    
    server {
        listen 80;
        server_name example.com;
        root /var/www/example/public;
        passenger_enabled on;
        
        # 5. Pre-start agar tidak ada delay saat akses pertama
        # (biasanya diletakkan di luar blok server, tapi diarahkan ke URL ini)
    }
    
    # Letakkan pre-start di level http
    passenger_pre_start http://example.com/;
}

Standalone:

passenger start \
  --environment production \
  --daemonize \
  --port 30000 \
  --app-type rack \
  --startup-file config.ru \
  --instance-registry-dir /home/user/tmp/ \
  --pid-file /home/user/run/passenger.30000.pid \
  --log-file /home/user/logs/passenger.30000.log \
  --max-pool-size 30 \
  --min-instances 5 \
  --pool-idle-time 0 \
  --max-request-queue-size 200 \
  --core-file-descriptor-ulimit 65535 \
  --max-requests 1000 \
  --friendly-error-pages \
  --envvar PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/usr/kerberos/sbin:/usr/kerberos/bin:/sbin:/bin:/root/bin \
  --envvar RAILS_ENV=production \
  --envvar RACK_ENV=production \
  --load-shell-envvars

Related