如何让Locust遵循DNS TTL并在负载测试中重新解析DNS
解决Locust负载测试时DNS解析不更新的问题
1. 调整HTTP客户端的DNS缓存策略
Locust底层依赖的requests/urllib3默认会缓存DNS解析结果,你可以通过两种方式强制刷新:
- 每次请求强制断开连接:在任务函数的请求中添加
Connection: close头,迫使每次请求重新建立连接并触发DNS解析:
response = self.client.get("/your-target-path", headers={"Connection": "close"})
- 自定义DNS解析逻辑:绕过客户端缓存,每次请求前手动解析域名:
import socket from locust import HttpUser, task class LoadTestUser(HttpUser): target_domain = "your-domain.com" @task def test_request(self): # 每次请求前重新解析域名 target_ip = socket.gethostbyname(self.target_domain) self.client.get(f"http://{target_ip}/your-target-path")
2. 用Locust定时任务刷新DNS
通过Locust的周期任务钩子,定期重新解析域名并更新目标地址:
from locust import HttpUser, task, events import socket target_domain = "your-domain.com" current_target_ip = socket.gethostbyname(target_domain) # 初始化时解析一次 @events.init.add_listener def init_dns(environment, **kwargs): global current_target_ip current_target_ip = socket.gethostbyname(target_domain) # 每30秒刷新一次DNS解析 @events.periodic_task(interval=30) def refresh_dns_cache(environment, **kwargs): global current_target_ip new_ip = socket.gethostbyname(target_domain) if new_ip != current_target_ip: current_target_ip = new_ip print(f"DNS解析已更新:{current_target_ip}") class LoadTestUser(HttpUser): @task def test_request(self): self.client.get(f"http://{current_target_ip}/your-target-path")
3. 调整Locust部署节点的系统级DNS缓存
如果EC2实例本身启用了系统DNS缓存(如systemd-resolved或nscd),可以缩短缓存TTL:
- 对于
systemd-resolved:编辑/etc/systemd/resolved.conf,设置DNSCacheTTL=10(单位:秒),然后重启服务:
sudo systemctl restart systemd-resolved
- 对于
nscd:编辑/etc/nscd.conf,将positive-timeout(DNS缓存时长)改为较小值(如10),再重启服务:
sudo systemctl restart nscd
内容的提问来源于stack exchange,提问作者Sébastien Allamand
相关产品推荐
相关产品推荐

