16. C++ TinyWebServer项目总结(16. 服务器调制、调试和测试)

ops/2024/12/23 3:36:13/

主要包括:

  1. 使用 tcpdump 抓包;
  2. 使用 gdb 调试器;
  3. 使用压力测试工具,模拟现实世界中的高并发请求,测试服务器在高压状态下的稳定性。

最大文件描述符数

Linux 对应用进程能打开的最大文件描述符数量有两个层次的限制:用户级限制系统级限制

用户级限制指目标用户运行的所有进程总共能打开的文件描述符数;

系统级限制指所有用户总共能打开的文件描述符数。

查看用户级文件描述符数量限制:

ulimit -n

将用户级文件描述符数量限制设定为 2048

ulimit -SHn 2048

但这种设置是临时的,只在当前session中有效,为永久修改用户级文件描述符数限制,可在/etc/security/limits.conf文件中加入以下两项:

* soft nofile 65535
* hard nofile 65535

然后重启系统或者注销并重新登录以应用这些更改。

注意:nofile 指的是每个用户进程可以打开的文件数。

调整内核参数

几乎所有内核模块,包括内核核心模块和驱动程序,都在/proc/sys目录下提供了某些配置文件以供用户调整模块的属性和行为。通常一个配置文件对应一个内核参数,文件名就是参数的名字,文件内容就是参数的值。我们可通过命令sysctl -a查看所有这些内核参数,我们只讨论其中与网络编程关系较为紧密的内核参数。

/proc/sys/fs 目录下的文件

/proc/sys/fs 目录下的内核参数都与文件系统相关,对服务器程序来说,有以下重要参数:

  1. /proc/sys/fd/file-max:系统级文件描述符数限制,修改它是临时性修改,与以上所述临时修改系统级文件描述符数的限制效果相同。一般修改完该文件后,需要把/proc/sys/fd/inode-max设置为新/proc/sys/fd/file-max值的3~4倍,否则可能导致i节点数不够用。
  2. /proc/sys/fd/epoll/max_user_watches:一个用户能够往epoll内核事件表中注册的事件总量。它是某用户打开的所有epoll实例总共能监听的事件数目,而不是单个epoll实例能监听的事件数目。往epoll内核事件表中注册一个事件,在32位系统上大概消耗90字节的内核空间,在64位系统上则消耗160字节的内核空间。这个内核参数限制了epoll使用的内核内存总量。

/proc/sys/net 目录下的文件

内核中网络模块的相关参数都位于/proc/sys/net目录下,其中和TCP/IP协议相关的参数主要位于以下3个子目录中:core、ipv4、ipv6,以下是和服务器性能相关的部分参数:

  1. /proc/sys/net/core/somaxconn:指定listen函数监听队列里,能建立完整连接从而进入ESTABLISHED状态的socket的最大数目。
  2. /proc/sys/net/ipv4/tcp_max_syn_backlog:指定listen函数监听队列里,能够转移至ESTABLISHEDSYN_RCVD状态的socket的最大数目。
  3. /proc/sys/net/ipv4/tcp_wmem:它包含3个值,分别指定一个socket的TCP写缓冲区的最小值、默认值、最大值。
  4. /proc/sys/net/ipv4/tcp_rmem:它包含3个值,分别指定一个socket的TCP读缓冲区的最小值、默认值、最大值。
  5. /proc/sys/net/ipv4/tcp_syncookies:指定是否打开TCP同步标签(syncookie),同步标签通过启动cookie来防止一个监听socket因不停地重复接收来自同一个地址的连接请求(同步报文段),而导致listen函数监听队列溢出(所谓的SYN风暴)。

除了通过直接修改文件的方式来修改这些系统参数外,我们也可使用sysctl命令来修改它们,这两种修改方式都是临时的,永久的修改方法是在/etc/sysctl.conf文件中加入相应网络参数及其数值,并执行sysctl -p使之生效。

gdb 调试

以下讨论如何使用gdb来调试多进程和多线程程序:

GDB(GNU Debugger)是一个强大的调试工具,主要用于调试C、C++和Fortran等编程语言的程序。它允许开发者执行程序的逐步执行、设置断点、检查变量值、修改内存内容等,从而帮助定位和修复程序中的错误。

用 gdb 调试多进程程序

如果一个进程通过fork系统调用创建了子进程,gdb会继续调试原来的进程,子进程则正常运行,以下方式可调试子进程:

  1. 单独调试子进程:子进程本质上来说也是一个进程,因此我们可通过通用的 gdb 调试方法来调试它,例如,我们可先运行服务器,然后找到子进程的 PID,再将其附加(attach)到gdb调试器上;
  2. 使用调试器选项follow-fork-mode:gdb 调试器的选项follow-fork-mode 允许我们选择程序在执行fork系统调用后是继续调试父进程还是调试子进程,其用法如下:
(gdb) set follow-fork-mode mode

mode的可选值是parentchild,分别表示调试父进程和子进程

用 gdb 调试多线程程序

gdb 有一组命令可辅助多线程程序的调试

一个关于调试进程池和线程池程序的不错的方法是,将池中的进程或线程个数减少至1,以观察程序的逻辑是否正确,然后逐步增加进程或线程数量,以调试进程或线程的同步是否正确。

压力测试

压力测试程序有很多种实现方式,如 I/O 复用方式、多线程(进程)并发编程方式,以及这些方式的结合使用,但单纯的 I/O 复用方式的施压程度是最高的,因为线程和进程的调度本身也要占用一定CPU时间。

参考

  1. Linux高性能服务器编程 学习笔记 第十六章 服务器调制、调试和测试_socket buffer最大值 wmem-CSDN博客


http://www.ppmy.cn/ops/117240.html

相关文章

在CentOS上搭建NFS服务器

环境:CentOS5.2 由于CentOS里面已经装了NFS服务,故不需要安装该服务,只需要进行如下的设置即可: 1、 修改/etc/exports文件,添加如下内容: /home/guochongxin *(rw,sync,no_root_squash) 保存后执行: e…

[图解]静态关系和动态关系

1 00:00:01,060 --> 00:00:04,370 首先我们来看静态关系和动态关系 2 00:00:06,160 --> 00:00:10,040 我们要尽量基于静态关系来建立动态关系 3 00:00:11,740 --> 00:00:13,740 不能够在没有这个的基础上 4 00:00:14,220 --> 00:00:17,370 没有这个的情况下就胡…

操作系统 | 学习笔记 | | 王道 | 5.3 磁盘和固态硬盘

5.3 磁盘和固态硬盘 5.3.1 磁盘 磁盘结构 磁盘:磁盘的表面由一些磁性物质组成,可以用这些磁性物质来记录二进制数据 磁道:磁盘的盘面被划分成一个个磁道。这样的一个“圈”就是一个磁道 扇区:一个磁道又被划分成一个个扇区&am…

Hi3403V100 4K/60 芯片及开发板

Hi3403V100是一颗面向监控市场推出的专业 Ultra-HD Smart IP Camera SOC,该芯片最高支持四路sensor输入,支持最高4K60的ISP图像处理能力,支持3F WDR、多级降噪、六轴防抖、硬件拼接等多种图像增强和处理算法,为用户提供了卓越的图…

在 VS Code 中配置 C/C++ 开发环境(详细指南)

前言 Visual Studio Code(VS Code)是一个广泛使用的代码编辑器,支持多种编程语言,包括 C 和 C。本指南将详细介绍如何在 VS Code 中设置 C/C 开发环境,适合新手。 1. 安装编译器 1.1. Windows 系统 推荐使用 MinGW-…

UDP与TCP那个传输更快

UDP(用户数据报协议)和 TCP(传输控制协议)是互联网协议栈中常用的两种传输层协议。它们在设计和应用上存在一些显著的差异,导致在传输速度和可靠性等方面表现不同。以下是它们之间的比较,特别是关于传输速度…

页面禁用鼠标右键属于反爬虫措施吗 ?

是的,禁用鼠标右键通常被视为一种反爬虫(anti-scraping)措施。网站开发者常常采用这种技术来防止用户通过右键菜单复制文本、图像或其他内容,特别是在内容保护和数据安全方面。以下是禁用鼠标右键的一些背景和目的: 1…

红黑树(Red-Black Tree):原理、常见算法及其应用

目录 引言 红黑树的基本概念 常见算法 插入节点 查找节点 删除节点 红黑树的应用场景 1. 数据库索引 2. 符号表 3. 动态集合 总结 优势对比 自平衡条件 旋转次数 操作效率 应用场景 实现复杂度 引言 红黑树(Red-Black Tree)是一种自平…