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

50 lines
2.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
```python
@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 формы большого размера?
Что попробовать В КОДЕ (не в инфраструктуре)?