<p>WAKTU PEKERJA KRITIS gunicorn</p>

Dibuat pada 21 Jan 2017  ·  18Komentar  ·  Sumber: benoitc/gunicorn

Saya menjalankan gunicorn dengan pengaturan berikut:
gunicorn --worker-class gevent --timeout 30 --graceful-timeout 20 --max-requests-jitter 2000 --max-requests 1500 -w 50 --log-level DEBUG --capture-output --bind 0.0.0.0:5000 run:app dan saya melihat semua kecuali 3 pekerja [CRITICAL] WORKER TIMEOUT . Setelah beberapa saat, gunicorn tidak dapat menelurkan lagi pekerja atau setidaknya sangat lambat dalam menelurkan mereka. Ini menyebabkannya tidak membuat server dapat dijangkau dan permintaan apa pun tidak dapat dijangkau.

Saya mengurangi jumlah pekerja menjadi 3 dan memberi setiap pekerja 2 utas dan sekarang saya tidak melihat masalah ini lagi.

Saya tidak bisa mendapatkan stacktrace dari batas waktu tetapi ini sepertinya setelah sejumlah pekerja tidak dapat menanganinya?

( unconfirmed - Bugs -

Komentar yang paling membantu

Siapa pun yang masih memiliki masalah ini, silakan periksa ketersediaan sumber daya untuk aplikasi selain menambah batas waktu dan mengubah jenis kelas pekerja

Saya mengalami masalah ini ketika saya mencoba untuk menyebarkan aplikasi saya menggunakan Docker Swarm dan menyadari bahwa saya membatasi sumber daya terlalu rendah untuk aplikasi tersebut. Meningkatkan sumber daya memecahkan masalah bagi saya

deploy:
  replicas: 5
  resources:
    limits:
      cpus: "0.1"
      memory: 50M
  restart_policy:
    condition: on-failure

Saya pikir ini bukan bug, hanya bagaimana cara kami mengonfigurasi aplikasi kami

Semua 18 komentar

ketika batas waktu pekerja itu berarti bahwa ia tidak memberi tahu arbiter pada waktunya bahwa ia masih hidup. Apakah Anda memiliki tugas yang dijalankan selama permintaan yang bisa memakan waktu lebih lama dari batas waktu?

@jseaidou benjolan.

Maaf atas keterlambatan balasan @benoitc. Masalah yang saya lihat sebenarnya adalah utas yang tidak aktif melakukan ini. Utas aktif saya tidak kehabisan waktu, yang tidak aktif di bawah beban lebih sedikit memberikan lebih banyak kesalahan batas waktu kritis daripada hanya mengatur waktu dengan anggun. Saya beralih dari gevent ke tornado dan itu tampaknya telah memperbaiki masalah hang, tetapi saya masih melihat 3 pekerja secara konsisten memberikan batas waktu kritis setiap 30 detik. Jika ini adalah batas waktu normal, itu seharusnya tidak menjadi kesalahan kritis.

Saya menghadapi masalah yang persis sama.
Gunicorn 19.7.1
peristiwa 1.2.1
Python 3.5.3
Berjalan di Docker, gambar berdasarkan resmi " python:3.5 "

@jseaidou itu adalah batas waktu yang normal dalam arti wasit bereaksi terhadapnya. Ini penting karena biasanya tidak terjadi.

Kemungkinan besar salah satu pekerja Anda sedang melakukan operasi pemblokiran yang mencegah pekerja gunicorn untuk memberi tahu arbiter. Jika Anda memiliki operasi yang lama, pastikan untuk memicu penjadwal gen dari waktu ke waktu dengan tidur atau semacamnya. atau apa pun yang memanggil penjadwal tornado kembali juga.

Bagaimana cara mereproduksi masalah?

@saabeilin sama ^^

Saya melihat hal yang sama: pekerja kehabisan waktu bahkan ketika tidak melayani permintaan. Yang saya lakukan hanyalah meluncurkan wadah saya di AWS ECS.

[2017-06-27 20:41:56 +0000] [1] [DEBUG] Current configuration:
proxy_protocol: False
worker_connections: 1000
statsd_host: None
max_requests_jitter: 0
post_fork: <function post_fork at 0x7f6bbc3f1938>
errorlog: -
enable_stdio_inheritance: False
worker_class: sync
ssl_version: 2
suppress_ragged_eofs: True
syslog: False
syslog_facility: user
when_ready: <function when_ready at 0x7f6bbc3f1668>
pre_fork: <function pre_fork at 0x7f6bbc3f17d0>
cert_reqs: 0
preload_app: False
keepalive: 2
accesslog: -
group: 0
graceful_timeout: 30
do_handshake_on_connect: False
spew: False
workers: 4
proc_name: None
sendfile: None
pidfile: None
umask: 0
on_reload: <function on_reload at 0x7f6bbc3f1500>
pre_exec: <function pre_exec at 0x7f6bbc3f1ed8>
worker_tmp_dir: None
limit_request_fields: 100
pythonpath: None
on_exit: <function on_exit at 0x7f6bbc3f7758>
config: None
logconfig: None
check_config: False
statsd_prefix:
secure_scheme_headers: {'X-FORWARDED-PROTOCOL': 'ssl', 'X-FORWARDED-PROTO': 'https', 'X-FORWARDED-SSL': 'on'}
reload_engine: auto
proxy_allow_ips: ['127.0.0.1']
pre_request: <function pre_request at 0x7f6bbc3f70c8>
post_request: <function post_request at 0x7f6bbc3f71b8>
forwarded_allow_ips: ['127.0.0.1']
worker_int: <function worker_int at 0x7f6bbc3f1c08>
raw_paste_global_conf: []
threads: 1
max_requests: 0
chdir: /opt/app
daemon: False
user: 0
limit_request_line: 4094
access_log_format: %(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"
certfile: None
on_starting: <function on_starting at 0x7f6bbc3f1398>
post_worker_init: <function post_worker_init at 0x7f6bbc3f1aa0>
child_exit: <function child_exit at 0x7f6bbc3f7320>
worker_exit: <function worker_exit at 0x7f6bbc3f7488>
paste: None
default_proc_name: app:app
syslog_addr: udp://localhost:514
syslog_prefix: None
ciphers: TLSv1
worker_abort: <function worker_abort at 0x7f6bbc3f1d70>
loglevel: DEBUG
bind: ['0.0.0.0:5005']
raw_env: []
initgroups: False
capture_output: False
reload: False
limit_request_field_size: 8190
nworkers_changed: <function nworkers_changed at 0x7f6bbc3f75f0>
timeout: 30
keyfile: None
ca_certs: None
tmp_upload_dir: None
backlog: 2048
logger_class: gunicorn.glogging.Logger
[2017-06-27 20:41:56 +0000] [1] [INFO] Starting gunicorn 19.7.1
[2017-06-27 20:41:56 +0000] [1] [DEBUG] Arbiter booted
[2017-06-27 20:41:56 +0000] [1] [INFO] Listening at: http://0.0.0.0:5005 (1)
[2017-06-27 20:41:56 +0000] [1] [INFO] Using worker: sync
[2017-06-27 20:41:56 +0000] [8] [INFO] Booting worker with pid: 8
[2017-06-27 20:41:57 +0000] [9] [INFO] Booting worker with pid: 9
[2017-06-27 20:41:57 +0000] [10] [INFO] Booting worker with pid: 10
[2017-06-27 20:41:57 +0000] [12] [INFO] Booting worker with pid: 12
[2017-06-27 20:41:57 +0000] [1] [DEBUG] 4 workers
[2017-06-27 20:42:15 +0000] [10] [DEBUG] Closing connection.
[2017-06-27 20:42:15 +0000] [8] [DEBUG] Closing connection.
[2017-06-27 20:42:45 +0000] [8] [DEBUG] Closing connection.
[2017-06-27 20:42:45 +0000] [10] [DEBUG] Closing connection.
[2017-06-27 20:42:46 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:9)
[2017-06-27 20:42:46 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:12)
[2017-06-27 20:42:46 +0000] [9] [INFO] Worker exiting (pid: 9)
[2017-06-27 20:42:46 +0000] [12] [INFO] Worker exiting (pid: 12)
[2017-06-27 20:42:46 +0000] [1] [DEBUG] 3 workers
[2017-06-27 20:42:46 +0000] [24] [INFO] Booting worker with pid: 24
[2017-06-27 20:42:46 +0000] [25] [INFO] Booting worker with pid: 25
[2017-06-27 20:42:46 +0000] [1] [DEBUG] 4 workers

Ini tidak terjadi saat dijalankan secara lokal. :-/

Sepertinya beralih ke gevent pekerja telah menyelesaikannya untuk saya. \_(ツ)_/¯

Duplikat #1194, saya pikir.

Saya telah melihat ini terjadi berulang kali akhir-akhir ini, dan bagi saya itu tampaknya terkait dengan menidurkan laptop. Ketika saya membuka tutupnya, banyak pesan ini muncul. Tidak yakin ini membantu, tetapi saya pikir saya akan menyebutkannya ...

gunicorn --daemon --workers 2 --timeout 120 --bind 127.0.0.1:4000 --pid /var/run/mshc_admin.pid --user danilovskoe --group danilovskoe --chdir /home/danilovskoe/mshc2/src /flask/ --env MSHC_PRODUCTION=/etc/monit/mshc.config.py admin_ gunicorn:app

batas waktu 30 detik
DAPATKAN permintaan

ubuntu 16.04
labu 0.12.2
Python 3.6.3 (default, 4 Okt 2017, 02:55:45)
[GCC 5.4.0 20160609] di linux
gunicorn (versi 19.7.1)

Saya bertemu dengan masalah.

Tepat setelah memulai aplikasi, itu berfungsi. Tetapi hanya jika ada permintaan, [CRITICAL] WORKER TIMEOUT akan dipicu. Sebagai contoh,

[2018-01-02 16:38:03 +0800] [24355] [INFO] Starting gunicorn 19.7.1
[2018-01-02 16:38:03 +0800] [24355] [DEBUG] Arbiter booted
[2018-01-02 16:38:03 +0800] [24355] [INFO] Listening at: http://0.0.0.0:8080 (24355)
[2018-01-02 16:38:03 +0800] [24355] [INFO] Using worker: gevent
[2018-01-02 16:38:03 +0800] [24358] [INFO] Booting worker with pid: 24358
[2018-01-02 16:38:03 +0800] [24355] [DEBUG] 1 workers

[2018-01-02 16:38:10 +0800] [24358] [DEBUG] GET /v1/bj2/CC/uuid
[2018-01-02 16:38:10 +0800] [24358] [DEBUG] Closing connection. 
[2018-01-02 16:38:41 +0800] [24355] [CRITICAL] WORKER TIMEOUT (pid:24358)
[2018-01-02 16:38:41 +0800] [24358] [INFO] Worker exiting (pid: 24358)
[2018-01-02 16:38:41 +0800] [24381] [INFO] Booting worker with pid: 24381

[2018-01-02 16:48:51 +0800] [24355] [CRITICAL] WORKER TIMEOUT (pid:24381)
[2018-01-02 16:48:51 +0800] [24381] [INFO] Worker exiting (pid: 24381)
[2018-01-02 16:48:51 +0800] [24703] [INFO] Booting worker with pid: 24703
[2018-01-02 16:48:51 +0800] [24703] [INFO] worker pid 24703 notify
[2018-01-02 16:48:51 +0800] [24703] [DEBUG] GET /v1/bj2/CC/uuid
[2018-01-02 16:48:51 +0800] [24703] [DEBUG] Closing connection. 
CentOS: 6.7
Python: 3.6.3
Gevent: 1.2.2
Greenlet: 0.4.9
Gunicorn: 19.7.1

RUN CMD: gunicorn --worker-class gevent --log-level debug --bind 0.0.0.0:8080 app

Ketika saya mengganti kelas pekerja ke eventlet , itu,
gunicorn --worker-class eventlet --log-level debug --bind 0.0.0.0:8080 app ,
tidak apa-apa.

Pemberitahuan: Aplikasi saya berjalan di host fisik, bukan host virtual maupun host cloud.


Memperbarui:

Jadi saya kira itu pertanyaan tentang gevent atau pekerja gevent.

Ada laporan tentang masalah gevent ini yang memecahkan masalah dan gevent yang menyebabkan masalah. Saya tidak dapat mengidentifikasi akar penyebab di sini. Beberapa laporan mungkin sama dengan #1194, tetapi yang lain mungkin tidak.

Jika ada yang bisa membagikan kasus minimal untuk direproduksi, itu akan membantu.

Saya tidak yakin itu pasti masalah yang sama, tetapi saya dapat mereproduksi ini 100% menggunakan Virtualbox dengan pengaturan berikut:

Tuan rumah: Windows 10
Tamu: Ubuntu 16.04
Gunicorn: 19.7.1

Saya meneruskan TCP:8000 antara Host dan tamu melalui koneksi NAT default. Menggunakan sync worker, setiap permintaan pada Host untuk localhost:8000 menyebabkan kesalahan ini muncul di log, tetapi jika saya membuat permintaan yang sama pada guest , log akan dihapus. Beralih ke --worker-class eventlet menghapus jejak.

Saya menghargai Virtualbox adalah dimensi yang sama sekali berbeda, tetapi kedengarannya sangat mirip dengan apa yang dijelaskan di atas, dan secara konsisten dapat direproduksi (setidaknya untuk saya).

Saya melihat ini terjadi dengan unggahan yang lambat. Selama pengunggahan (ke situs Django) jika batas waktu pekerja tercapai, pengunggahan mati.

@lordmauve jika Anda menggunakan pekerja sinkronisasi yang diharapkan. Permintaan panjang akan memblokir pekerja dan akhirnya arbiter akan membunuhnya. Anda dapat menggunakan jenis pekerja yang berbeda jika Anda mengharapkan permintaan yang panjang akan berhasil.

Bagi siapa pun yang membaca utas ini, silakan buka kembali dengan kasing minimal untuk mereproduksi. Saya tidak dapat melihat penyelidikan bersih untuk dilakukan di sini. Untuk kasus AWS/ECS, saya masih membiarkan #1194 terbuka sampai saya dapat menguji konfigurasi yang saya daftarkan (https://github.com/benoitc/gunicorn/issues/1194#issuecomment-371250650).

Siapa pun yang masih memiliki masalah ini, silakan periksa ketersediaan sumber daya untuk aplikasi selain menambah batas waktu dan mengubah jenis kelas pekerja

Saya mengalami masalah ini ketika saya mencoba untuk menyebarkan aplikasi saya menggunakan Docker Swarm dan menyadari bahwa saya membatasi sumber daya terlalu rendah untuk aplikasi tersebut. Meningkatkan sumber daya memecahkan masalah bagi saya

deploy:
  replicas: 5
  resources:
    limits:
      cpus: "0.1"
      memory: 50M
  restart_policy:
    condition: on-failure

Saya pikir ini bukan bug, hanya bagaimana cara kami mengonfigurasi aplikasi kami

@jseaidou itu adalah batas waktu yang normal dalam arti wasit bereaksi terhadapnya. Ini penting karena biasanya tidak terjadi.

Kemungkinan besar salah satu pekerja Anda sedang melakukan operasi pemblokiran yang mencegah pekerja gunicorn untuk memberi tahu arbiter. Jika Anda memiliki operasi yang lama, pastikan untuk memicu penjadwal gen dari waktu ke waktu dengan tidur atau semacamnya. atau apa pun yang memanggil penjadwal tornado kembali juga.

Bagaimana cara mereproduksi masalah?

@saabeilin sama ^^

Terima kasih, ini masuk akal.
Bagi saya ini terjadi saat menyajikan file besar yang sebelumnya diunduh dari penyimpanan cloud.
Berdasarkan permintaan, file diambil ke disk lokal dari penyimpanan cloud, kemudian didekripsi aliran ke klien. Pengunduhan dari penyimpanan cloud berfungsi dengan baik, meskipun membutuhkan waktu 10 menit atau lebih lama.
Setelah pekerja mulai mendekripsi aliran file dari disk ke klien, ia mati setelah beberapa ratus MB, mungkin karena waktu habis saat sedang sibuk dengan operasi pemblokiran ini.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat