Locust压测大文件PUT上传时出现SSLEOFError问题求助
大文件上传压测时出现SSLEOFError问题
测试环境为MacOS,基于Locust的HttpUser执行性能测试。上传约10MB文件,当并发用户数超过40(RPS与用户数相等)时,部分PUT请求出现以下错误:
PUT doc_upload_bigSize_PUT_method: SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:2396)')
已尝试升级所有OpenSSL相关包、安装httpsclient组件,但问题仍存在,仍有2-3个请求返回该错误。多数请求能正常执行,怀疑是脚本或配置问题。
相关代码
文件上传工具方法
@staticmethod def file_upl_pdf(dirname, file_name): upload = open(f"{dirname}/{file_name}", "rb") return upload
测试脚本核心逻辑
def upload_big_size_doc(self): file_name = "test_file_big_size.pdf" res = self.client.post("/documents", data=json.dumps(data), name='doc_upload_bigSize_POST_method') json_response = json.loads(res.text) document_id = jsonpath.jsonpath(json_response, "documentId")[0] url_upload = jsonpath.jsonpath(json_response, "url")[0] self.client.put(url=url_upload, data=ResourceUtils.file_upl_pdf(dirname="../test_files/big_size", file_name=file_name), headers={'Content-Type': 'application/pdf'}, name='doc_upload_bigSize_PUT_method')
任务执行逻辑
@task def perf_test(self): self.upload_big_size_doc()
排查方向与解决方案
修复文件句柄泄漏问题
原工具方法打开文件后未关闭,高并发下会引发资源泄漏,间接导致SSL连接异常。修改代码自动管理文件句柄:@staticmethod def file_upl_pdf(dirname, file_name): with open(f"{dirname}/{file_name}", "rb") as f: return f.read()直接返回文件内容而非文件对象,既避免资源泄漏,也能让requests自动计算正确的
Content-Length,减少服务器端异常断开的概率。配置连接超时与重试机制
高并发下连接复用可能出现异常,给Locust客户端添加超时设置和重试:class MyUser(HttpUser): wait_time = between(1, 2) def __init__(self, parent): super().__init__(parent) self.client.timeout = 30 # 延长请求超时时间 self.client.mount('https://', HTTPAdapter(max_retries=2)) # 添加重试逻辑检查服务器端SSL限制
高并发下服务器可能因连接数超限、超时设置等主动断开SSL连接,建议查看服务器的SSL相关日志(如Nginx的error.log),确认是否存在主动断开的记录。调整MacOS系统SSL参数
MacOS自带OpenSSL可能有默认限制,可通过环境变量调整:export SSL_CIPHER_SUITE='HIGH:!aNULL:!MD5' export OPENSSL_CONF=/usr/local/etc/openssl/openssl.cnf locust -f your_test_script.py
内容的提问来源于stack exchange,提问作者Matelko
相关产品推荐
相关产品推荐

