Files
loadtest/History/sonnet-question-flask.md
T
2026-07-10 23:08:50 +04:00

2.2 KiB
Raw Blame History

Sonnet: Flask за ingress'ом дропает большие POST — nginx echo нет

Новый решающий тест

Nginx:alpine через тот же VIP/ingress — 100KB POST = 10/10 успех. Flask через тот же VIP/ingress — 100KB POST = 2-5/10.

VIP, ingress, kube-vip, сеть исключены. Проблема в связке «ingress → Flask».

Что уже проверили на Flask

  • debug=True → debug=False: 5/10 (незначительно)
  • request.get_data() перед request.form: 2/10 (ухудшило, откачено)
  • proxy_request_buffering off: 5/10 (лучше чем on = 3/10)
  • proxy_request_buffering on: 3/10
  • Внутри кластера (pod→pod, pod→ingress): 10/10 всегда

Инфра

  • Flask 3.1.3, Werkzeug 3.1.8, Python 3.12
  • Запуск: app.run(host='0.0.0.0', port=5000, debug=False, threaded=True)
  • Ingress: nginx, proxy_http_version 1.1, proxy_request_buffering off
  • Flask отвечает Connection: close (dev server не держит keepalive)
  • Content-Type: application/x-www-form-urlencoded, тело ~136KB (base64)
  • Код: request.form.get('data', '') → парсинг формы

Код /upload

@app.route('/upload', methods=['POST'])
def upload():
    t0 = time.time()
    data = request.form.get('data', '')
    if data:
        if ',' in data:
            data = data.split(',', 1)[1]
        data = data.replace(' ', '+')
        missing = len(data) % 4
        if missing:
            data += '=' * (4 - missing)
        raw = base64.b64decode(data)
        elapsed = round((time.time() - t0) * 1000)
        return {'ok': True, 'bytes': len(raw), 'elapsed_ms': elapsed}
    for f in request.files.values():
        ...
    return {'ok': True, 'bytes': total, 'elapsed_ms': elapsed}

Вопрос

Почему Flask за nginx ingress'ом дропает connection на большом POST, а nginx:alpine — нет? Может ли Werkzeug dev server иметь проблему с chunked transfer encoding от ingress'а? Или проблема в парсинге URL-encoded формы большого размера? Что попробовать В КОДЕ (не в инфраструктуре)?