公司网络性能优化实战:5步搞定内网瓶颈
版本升级后 API 全变了?别慌。很多开发者在公司网络环境下,刚把依赖升到最新,请求直接 404 或超时,排查半天发现是内网代理拦截了 HTTPS 流量。这不仅是配置问题,更是性能优化的起点。
项目目标:从“能跑”到“快跑”
在公司内网开发,最大的坑不是代码逻辑,而是网络环境。防火墙、代理、DNS 解析慢,这些都会让原本毫秒级的请求变成秒级等待。我们的目标很简单:
- 打通链路:确保本地开发环境能正常访问外网 API 和内网服务。
- 消除瓶颈:通过代码层面和网络配置,减少不必要的握手和重试。
- 可复现:所有配置脚本化,新同事入职一键配置,不再口口相传。
这个项目不写业务逻辑,只写一个轻量级的网络诊断与优化工具。它能帮你检测当前网络延迟、DNS 解析速度,并自动配置合适的代理参数。
目录结构:极简但够用
我们保持工程化原则,结构越简单越好维护。
company-net-optimizer/
├── main.py # 入口文件
├── config.py # 配置管理
├── checker.py # 网络检测模块
├── proxy.py # 代理设置模块
├── requirements.txt # 依赖包
└── README.md # 使用说明
main.py: 命令行入口,接收用户指令。checker.py: 核心模块,负责 ping、DNS 解析、HTTP 请求耗时分析。proxy.py: 动态修改环境变量,适配不同操作系统。config.py: 读取 JSON 或 YAML 配置,避免硬编码 IP。
核心代码实现:逐行讲解
1. 配置管理:告别硬编码
公司网络环境多变,IP 和端口不能写死在代码里。我们用 config.py 统一管理。
import json
import osclass Config:def __init__(self):# 默认配置,可被环境变量覆盖self.proxy_host = os.getenv('COMPANY_PROXY_HOST', 'proxy.internal.com')self.proxy_port = int(os.getenv('COMPANY_PROXY_PORT', 8080))self.timeout = int(os.getenv('NET_TIMEOUT', 5))def load_custom(self, file_path='config.json'):"""加载本地自定义配置,覆盖默认值"""if os.path.exists(file_path):with open(file_path, 'r') as f:data = json.load(f)self.proxy_host = data.get('proxy_host', self.proxy_host)self.proxy_port = data.get('proxy_port', self.proxy_port)self.timeout = data.get('timeout', self.timeout)return self
关键点:使用 os.getenv 允许用户在 CI/CD 或不同机器上通过环境变量注入配置,这是企业级开发的标配。
2. 网络检测:定位性能瓶颈
checker.py 是核心。很多性能优化误区在于“盲目重试”。我们要先测出哪里慢。
import time
import socket
import requestsdef check_dns(host):"""测试 DNS 解析耗时"""start = time.time()try:ip = socket.gethostbyname(host)duration = time.time() - startreturn {"status": "ok", "ip": ip, "duration_ms": round(duration * 1000, 2)}except socket.gaierror:return {"status": "fail", "error": "DNS resolution failed"}def check_latency(host, port=443):"""测试 TCP 连接耗时"""start = time.time()try:sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.settimeout(5)sock.connect((host, port))duration = time.time() - startsock.close()return {"status": "ok", "latency_ms": round(duration * 1000, 2)}except socket.timeout:return {"status": "timeout", "error": "Connection timed out"}except Exception as e:return {"status": "error", "error": str(e)}
为什么分开测? DNS 慢通常是本地 DNS 服务器问题或内网递归查询慢;TCP 慢则是防火墙策略或路由问题。分开测才能对症下药。
3. 代理设置:自动适配环境
公司网络通常强制代理。proxy.py 负责设置 HTTPS_PROXY 和 HTTP_PROXY。
import os
import platformdef set_proxy(host, port):"""根据操作系统设置代理环境变量"""proxy_url = f"http://{host}:{port}"# 同时设置 HTTP 和 HTTPSos.environ['HTTP_PROXY'] = proxy_urlos.environ['HTTPS_PROXY'] = proxy_url# 排除内网地址,避免代理死循环internal_ips = '10.0.0.0/8,172.16.0.0/12,192.168.0.0/16'os.environ['NO_PROXY'] = f'localhost,127.0.0.1,{internal_ips}'print(f"[OK] Proxy set to {proxy_url}")print(f"[OK] NO_PROXY set to {os.environ['NO_PROXY']}")
避坑指南:很多开发者忘记设置 NO_PROXY,导致访问内网服务(如数据库、内部 API)时走了外网代理,直接超时。这一步必须做。
4. 主流程:一键诊断
main.py 串联所有模块,提供命令行体验。
import sys
from config import Config
from checker import check_dns, check_latency
from proxy import set_proxydef run_diagnosis():config = Config().load_custom()print("=" * 30)print(" Company Network Optimizer")print("=" * 30)# 1. 设置代理set_proxy(config.proxy_host, config.proxy_port)# 2. 测试关键节点targets = [("api.github.com", 443),("pypi.org", 443),("registry.npmjs.org", 443)]for host, port in targets:dns_res = check_dns(host)tcp_res = check_latency(host, port)status_icon = "✅" if dns_res['status'] == 'ok' and tcp_res['status'] == 'ok' else "❌"print(f"{status_icon} {host}")print(f" DNS: {dns_res.get('duration_ms', 'N/A')}ms | TCP: {tcp_res.get('latency_ms', 'N/A')}ms")if dns_res['status'] != 'ok':print(f" ⚠️ DNS Error: {dns_res.get('error')}")if tcp_res['status'] != 'ok':print(f" ⚠️ TCP Error: {tcp_res.get('error')}")print("=" * 30)print(" Diagnosis Complete")print("=" * 30)if __name__ == '__main__':run_diagnosis()
运行与测试:实战场景
假设你刚接手一个老项目,依赖升级后 pip install 失败。
运行诊断:
python main.py输出显示
pypi.orgDNS 解析耗时 800ms,TCP 连接超时。定位问题: DNS 慢说明本地 DNS 配置有问题。公司内网 DNS 可能只解析内部域名,对外部域名递归查询慢。
解决方案:
- 临时方案:在代码中指定公共 DNS(如 8.8.8.8),但需注意公司安全策略。
- 长期方案:联系 IT 部门优化 DNS 转发规则,或在
config.json中配置备用 DNS。
验证效果: 再次运行
python main.py,DNS 耗时降至 20ms 以内,pip install速度提升 10 倍。
注意:不要在生产环境随意修改 DNS。以上操作仅限开发环境调试。
优化扩展:进阶技巧
1. 连接池复用
在高频请求场景中,每次新建 TCP 连接开销巨大。使用 requests.Session 可以复用连接。
import requestssession = requests.Session()
adapter = requests.adapters.HTTPAdapter(pool_connections=10, pool_maxsize=10)
session.mount('https://', adapter)# 多次请求复用同一连接
for i in range(10):response = session.get('https://api.example.com/data')
原理:HTTPAdapter 维护一个连接池,避免每次请求都进行 DNS 解析和 TCP 三次握手。
2. 超时分级设置
不要所有请求都用同一个超时时间。
- 快速接口(如健康检查):1 秒
- 普通接口(如数据查询):5 秒
- 慢接口(如文件下载):30 秒
def make_request(url, timeout_type='normal'):timeouts = {'fast': 1,'normal': 5,'slow': 30}timeout = timeouts.get(timeout_type, 5)return requests.get(url, timeout=timeout)
3. 监控告警
将 checker.py 的结果写入日志,并对接公司监控系统(如 Prometheus)。当 DNS 耗时超过阈值时,自动发送告警。
import logginglogging.basicConfig(level=logging.INFO)
logger = logging.getLogger('net_optimizer')def check_with_alert(host):res = check_latency(host)if res['status'] == 'ok' and res['latency_ms'] > 100:logger.warning(f"High latency detected for {host}: {res['latency_ms']}ms")
小结
公司网络环境的性能优化,90% 的问题出在配置而非代码。
- 先诊断,后优化:不要盲目加缓存或改代码,先测出瓶颈在哪。
- 配置即代码:所有网络参数脚本化管理,避免“在我电脑上没问题”的尴尬。
- 隔离内外网:正确设置
NO_PROXY,避免内网流量走外网代理。
这套工具代码量不到 200 行,但能解决 80% 的内网开发网络问题。你可以直接复制到你的项目中,根据公司实际 IP 调整 config.json。
这个知识点你面试被问过吗?留言说说