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

主要包括:

  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.mzph.cn/news/880311.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

4. 数据结构: 对象和数组

数字、布尔值和字符串是构建数据结构的原子。不过,许多类型的信息需要不止一个原子。对象允许我们对值(包括其他对象)进行分组,从而构建更复杂的结构。到目前为止,我们所构建的程序都受到限制,因为它们只能…

软件设计模式——工厂模式

软件设计模式——工厂模式 文章目录 软件设计模式——工厂模式一、设计模式的认知1.1 什么是软件设计模式:1.2 为什么要学习设计模式:1.3 设计模式的分类: 二、工厂模式2.1 工厂模式实例: 一、设计模式的认知 1.1 什么是软件设计…

WordPress LearnPress插件 SQL注入复现(CVE-2024-8522)

0x01 产品描述: LearnPress 是一款功能强大的 WordPress LMS(学习管理系统)插件,适用于创建和销售在线课程。凭借其直观的界面和丰富的功能,无论您是否具备编程背景,都能轻松搭建起在线教育网站。学会如何使…

新能源汽车知识点集萃

功能安全-->ISO26262/GB∕T 34590 2021 信息安全--->ISO21434 预期功能安全--->ISO21448 建模规范-->MAAB/JMAAB/MISAR C Codeing Standard; 开发流程--CMMI/IATF16949//ASPICE(Automotive SPICE)/产品规划/概念开发/设计开发/试制试验与…

Java之路--瓦解逻辑控制与方法使用已是瓮中捉鳖

嗨嗨大家!今天我们来学习逻辑运算和方法的使用~ 目录 一 逻辑控制 1 分支结构 1.1 if语句 1.2 switch 语句 2 循环结构 2.1 while 循环 2.2 for 循环 2.3 do while 循环 2.4 break 2.5 continue 3. 输出输入 二、方法的使用 1 方法定义语法 2 实参和…

网络通信——DHCP

目录 一.DHCP应用场景 二.通信过程 三.DHCP报文 四.DHCP通信原理 (1)租借过程 (2)DHCP 租期更新 (3)DHCP重绑定 五.一般路由器的DHCP支持两种地址池 (1)接口地址池 &…

进制转换,原码反码补码

正数的三码合一 1个byte8位,-128符号位溢出了,所以是1000 0000

基于Python大数据的B站热门视频的数据分析及可视化系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏:Java精选实战项目…

【JAVA源码授权】

代码混淆 使用代码混淆工具(如 ProGuard 或其他 Java 混淆器)来混淆源代码和字节码,使其难以被理解和逆向工程。混淆过程会重命名类、方法和变量,增加反编译的难度。 加密 Class 文件 将关键的 Class 文件进行加密,…

全连接神经网络

这里写目录标题 全连接神经网络vs前馈神经网络基于全连接神经网络的手写数字识别使用Pytorch实现纯Python实现 全连接神经网络的局限 端到端学习 深度学习有时也称为端到端机器学习(end-to-end machine learning)。这里所说的端到端是指从一端到另一端的…

David律所代理Jose Martin幽默水果版权首发维权,尚未TRO

案件基本情况:起诉时间:2024/9/18案件号:2024-cv-08484原告:Jose Martin原告律所:David起诉地:伊利诺伊州北部法院涉案商标/版权:原告品牌简介:西班牙的卓越艺术家Jose Martin以他非…

网络原理之IP协议(网络层)

目录 前言 什么是IP协议? IP协议的协议头格式 16位总长度(字节数) 16位标识、3位标志位和13位片偏移 8位生存时间 IP地址管理 1.动态分配IP 2.NAT机制(网络地址转换) NAT机制是如何工作的 NAT机制的优缺点…

Spring IoC DI 之 属性注入

一、DI (依赖注入) 依赖注入(DI)是一种实现控制反转(IoC)的技术,可以在运行时动态地向应用程序提供其所需的依赖。在 Spring 框架中,DI 是一种常用的实践,有助于提高代码的模块化和灵活性。下面…

GEE APP:基于gee开发一个在线监测Landsat5、7、8的云量面积和百分比的可视化应用

目录 简介 函数 bitwiseAnd(image2) Arguments: Returns: Image remap(from, to, defaultValue, bandName) Arguments: Returns: Image mask(mask) Arguments: Returns: Image 代码 结果 简介 Landsat系列影像云是指由美国地质调查局 (USGS) 发布的Landsat卫星拍…

MybatisPlus查询时间字段为空时报错问题

项目场景: 使用的MybatisPlus及自动生成代码的工具类,用的内置的默认模板。但在接口调用时发现时间字段数据库中的数据为空时,查询会直接报查询不到对应字段的异常。 查阅资料后,发现引起异常的原因是MybatisPlus代码生成器中生成…

Nginx反向代理配置支持websocket

一、官方文档 WebSocket proxying 为了将客户端和服务器之间的连接从HTTP/1.1转换为WebSocket,使用了HTTP/1.1中可用的协议切换机制(RFC 2616: Hypertext Transfer Protocol – HTTP/1.1)。 然而,这里有一个微妙之处:由于“升级”…

Windows C++:MoveFile、MoveFileEx、MoveFileWithProgress、CopyFile、CopyFileEx。

目录 一、MoveFile 参数 返回值 使用示例 注意事项 二、MoveFileEx 参数 返回值 使用示例 三、MoveFileWithProgress 参数 返回值 使用示例 注意事项 四、CopyFile 参数 返回值 使用示例 注意事项 五、CopyFileEx 参数 返回值 使用示例 注意事项 六、…

论文阅读:A Generalization of Transformer Networks to Graphs

论文阅读:A Generalization of Transformer Networks to Graphs 论文地址1 摘要2 贡献Graph TransformerOn Graph Sparsity(图稀疏)On Positional Encodings(位置编码)3 Graph Transformer Architecture(架…

Rust: AES 加密算法库

在Rust中,进行AES加密通常会用到一些现有的库,因为Rust标准库中并不直接提供AES加密的API。一个非常流行的库是crypto-box或者更广泛使用的ring库,但ring库由于依赖问题有时可能难以编译,另一个常用的库是cryptography的Rust绑定&…

【AI写作】解释区块链技术的应用场景和优势

【AI写作】解释区块链技术的应用场景和优势 浅浅的玩一下这个 AI 写作,本内容全为 AI 生成,仅为 AI 观点,无作者本人的观点。 区块链技术是一种去中心化的分布式账本技术,具有以下应用场景和优势: 金融领域&#xff…