面试题答案
一键面试性能调优
- 网络配置
- 带宽优化:确保服务器网络带宽足够,与网络服务提供商协商提升带宽,避免网络拥塞成为性能瓶颈。
- 负载均衡:使用负载均衡器(如 Nginx、HAProxy 等)将流量均匀分配到多个服务器实例上,减轻单个服务器压力。可以基于 IP、端口、HTTP 协议等多种方式进行负载均衡。例如,使用 Nginx 配置简单的 TCP 负载均衡:
stream {
upstream tcp_backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
server {
listen 80;
proxy_pass tcp_backend;
}
}
- **网络拓扑优化**:检查网络拓扑结构,减少网络设备(如路由器、交换机)之间的延迟和瓶颈,确保数据传输路径最短且高效。
2. 代码优化
- 异步编程:在 Python 中使用 asyncio
库实现异步 I/O 操作,以提高服务器并发处理能力。例如,将 TCP 服务器代码修改为异步模式:
import asyncio
async def handle_connection(reader, writer):
data = await reader.read(1024)
message = data.decode('utf - 8')
addr = writer.get_extra_info('peername')
print(f"Received {message!r} from {addr!r}")
writer.write(data)
await writer.drain()
writer.close()
async def main():
server = await asyncio.start_server(handle_connection, '127.0.0.1', 8888)
async with server:
await server.serve_forever()
if __name__ == "__main__":
asyncio.run(main())
- **优化数据处理逻辑**:检查服务器代码中数据处理部分,避免复杂的循环和重复计算。可以使用更高效的数据结构(如 `collections.deque` 替代 `list` 用于队列操作),以及优化算法复杂度。
- **连接池**:对于需要与其他服务(如数据库)建立连接的情况,使用连接池管理连接,减少连接创建和销毁的开销。例如,使用 `aiomysql` 库实现 MySQL 连接池:
import aiomysql
async def create_connection_pool():
pool = await aiomysql.create_pool(
host='127.0.0.1',
port=3306,
user='root',
password='password',
db='test',
autocommit=True
)
return pool
- 操作系统参数调整
- 文件描述符限制:提高操作系统允许的文件描述符数量,因为每个 TCP 连接都需要一个文件描述符。在 Linux 系统中,可以通过修改
/etc/security/limits.conf
文件来增加限制:
- 文件描述符限制:提高操作系统允许的文件描述符数量,因为每个 TCP 连接都需要一个文件描述符。在 Linux 系统中,可以通过修改
* soft nofile 65535
* hard nofile 65535
然后使用 ulimit -n 65535
使设置生效(临时生效,重启后需重新设置,或配置为开机启动脚本)。
- TCP 缓冲区调整:增大 TCP 接收和发送缓冲区大小,以提高数据传输效率。在 Linux 系统中,可以通过修改 /etc/sysctl.conf
文件来调整:
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
然后执行 sysctl -p
使设置生效。
- 内核参数优化:调整其他内核参数,如 net.ipv4.tcp_fin_timeout
减少 TIME - WAIT 状态连接的时间,net.ipv4.tcp_tw_reuse
允许重用处于 TIME - WAIT 状态的连接:
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_tw_reuse = 1
同样执行 sysctl -p
使设置生效。
安全性增强
- 防止 DDoS 攻击
- 流量清洗:使用专业的 DDoS 防护服务(如阿里云 DDoS 高防、腾讯云大禹等),这些服务提供商可以在网络边缘检测和清洗异常流量。
- 设置连接速率限制:在服务器代码中实现连接速率限制,例如使用
ratelimit
库(可自行实现类似逻辑):
from ratelimit import limits, sleep_and_retry
import time
CALLS = 10
PERIOD = 60 # 10 次连接每分钟
@sleep_and_retry
@limits(calls = CALLS, period = PERIOD)
def handle_connection():
# 处理连接逻辑
pass
- **SYN cookies**:在 Linux 系统中,开启 SYN cookies 功能,当服务器收到过多 SYN 包而导致 SYN 队列溢出时,它会发送一个带有 cookie 的 SYN + ACK 包,而不是在 SYN 队列中保存连接信息。可以通过修改 `/etc/sysctl.conf` 文件开启:
net.ipv4.tcp_syncookies = 1
然后执行 sysctl -p
使设置生效。
2. 防止端口扫描
- 隐藏端口:不将服务器端口暴露在公网,通过代理服务器(如 Nginx、HAProxy 等)进行端口转发,隐藏真实服务器端口。例如,使用 Nginx 将外部请求转发到内部服务器的不同端口:
server {
listen 80;
location / {
proxy_pass http://192.168.1.10:8080;
}
}
- **使用 iptables 限制访问**:在 Linux 系统中,使用 iptables 配置规则,只允许特定 IP 或 IP 段访问服务器端口。例如,只允许 192.168.1.0/24 网段访问 8080 端口:
iptables -A INPUT -p tcp --dport 8080 -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 8080 -j DROP
- **端口敲门**:实现端口敲门机制,客户端需要按照特定顺序发送连接请求到一系列端口,服务器验证通过后才开放真实服务端口。可以使用 `portknocking` 工具或自行编写脚本实现。