You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 09:55:09