当前位置: 首页 > news >正文

Linux高性能服务器编程 学习笔记 第十七章 系统监测工具

tcpdump是一款经典的抓包工具,即使今天我们已经有了像Wireshark这样更易于使用和掌握的抓包工具,tcpdump仍是网络程序员的必备利器。

tcpdump提供了一些选项用以过滤数据包或定制输出格式,常见的选项如下:
1.-n:使用IP地址表示主机,而非主机名;使用数字表示端口号,而非服务名。

2.-i:指定要监听的网卡接口。-i any表示抓取所有网卡接口上的数据包。

3.-v:输出更详细的信息,如显式IP数据包中的TTL和TOS信息。

4.-t:不打印时间戳。

5.-e:显示以太网帧头部信息。

6.-c:仅抓取指定数量的数据包。

7.-x:以十六进制数显示数据包的内容,但不显示包中以太网帧的头部信息。

8.-X:与7类似,但还打印每个十六进制字节对应的ASCII字符。

9.-XX:与8类型,但还打印以太网帧的头部信息。

10.-s:设置抓包时的抓取长度,当数据包的长度超过抓取长度时,tcpdump抓取到的是被截断的数据包。在4.0及之前的版本中,默认的抓包长度是68字节,这对于IP、TCP、UDP等协议时足够的,但对于DNS、NFS等协议,68字节通常不能容纳一个完整的数据包。4.0版本后,默认的抓包长度被修改为65535字节。

11.-S:以绝对值来显示TCP报文段的需要,而非相对值。

12.-w:将tcpdump的输出以某种格式定向到某个文件。

13.-r:从文件读取数据包信息并显示之。

除了使用选项外,tcpdump还支持用表达式进一步过滤数据包,tcpdump表示式的操作数分为3种:
1.类型:解释其后面跟着的参数的含义,其可选值包括host、net、port、portrange,它们分别指定主机名(或IP地址)、用CIDR方法表示的网络地址、端口号、端口范围。如要抓取整个1.2.3.0/255.255.255.0网络上的数据包,可用以下命令:
在这里插入图片描述
2.方向:其可选值为src(指定数据包的发送端)、dst(指定数据包的目的端)。如要抓取进入端口13579的数据包,可用以下命令:
在这里插入图片描述
3.协议:指定目标协议,如要抓取所有ICMP数据包,可用以下命令:
在这里插入图片描述
我们还可使用逻辑操作符来组织上述操作数以创建更复杂的表达式,tcpdump支持的逻辑操作符和编程语言中的逻辑操作符完全相同,包括and(&&)、or(||)、not(!)。如要抓取主机ernest-laptop和所有非Kongming20的主机之间交换的IP数据包,可用以下命令:
在这里插入图片描述
如果表达式比较复杂,我们可以用括号将它们分组,但在使用括号时,我们要么用反斜杠\对它转义,要么使用单引号'将其括住,以避免它被shell所解释。如要抓取来自主机10.0.2.4,目标端口是3389或22的数据包,可使用如下命令:
在这里插入图片描述
tcpdump还允许直接使用数据包中的部分协议字段的内容来过滤数据包,如仅抓取TCP同步报文段,可使用如下命令:
在这里插入图片描述
这是因为TCP头部的第14个字节的第2个位是同步标志,该命令也可表示为:
在这里插入图片描述
tcpdump的具体输出格式除了与选项有关外,还与协议有关,具体可参考tcpdump的man手册。

lsof(list open file)命令是一个列出当前系统打开的文件描述符的工具,通过它我们可以了解感兴趣的进程打开了哪些文件描述符,或者我们感兴趣的文件描述符被哪些进程打开了。

lsof命令常用的选项:
1.-i:显示socket文件描述符,该选项的使用方法是:
在这里插入图片描述
其中,4表示IPv4协议,6表示IPv6协议;protocol指定传输层协议,可以是TCP或UDP;hostname指定主机名;ipaddr指定主机的IP地址;service指定服务名;port指定端口号。如要显示所有连接到主机192.168.1.108的ssh服务的socket文件描述符,可用以下命令:
在这里插入图片描述
如果-i后不跟任何参数,则lsof命令将显示所有socket文件描述符。

2.-u:显示指定用户启动的所有进程打开的所有文件描述符。

3.-c:显示指定的命令打开的所有文件描述符,比如要查看websrv程序打开了哪些文件描述符,可用以下命令:
在这里插入图片描述
4.-p:显示指定进程打开的所有文件描述符。

5.-t:仅显示打开了目标文件描述符的进程的PID。

我们还可直接将文件名作为lsof命令的参数,以查看哪些进程打开了该文件。

查看websrv服务器打开了哪些文件描述符:
在这里插入图片描述
lsof命令的每行输出内容包含以下字段:
1.COMMAND:执行程序所使用的终端命令。默认仅显示前9个字符。

2.PID:文件描述符所属进程的PID。

3.USER:拥有该文件描述符的用户的用户名。

4.FD:文件描述符的描述。其中cwd表示进程的工作目录;rtd表示用户的根目录;txt表示进程运行的程序代码;mem表示直接映射到内存中的文件(上例中都是动态库)。有的FD格式为数字+访问权限,其中数字是文件描述符额具体数值,访问权限包括r(可读)、w(可写)、u(可读可写),上图中,0u、1u、2u分别表示标准输入、标准输出、标准错误输出,3u表示处于LISTEN状态的监听socket,4u表示epoll内核事件表对应的文件描述符。

5.TYPE:文件描述符的类型。其中DIR是目录;REG是普通文件;CHR是字符设备文件;IPv4是IPv4类型的socket文件描述符;0000是未知类型。更多类型可参考lsof命令的man手册。

6.DEVICE:文件所属设备。对于字符设备和块设备,其表示方法是主设备号,次设备号,由上图可见,测试机器上的程序文件和动态库都放在设备8,3上,其中,8表示这是一个SCSI(Small Computer System Interface,小型计算机系统接口)硬盘,3表示这是该硬盘上的第3个分区,即sda3。websrv进程的标准输入、标准输出、标准错误对应的设备是136,3,其中136表示这是一个伪终端,3表示它是第3个伪终端,即/dev/pts/3。对于FIFO类型的文件,如管道和socket,该字段将显示一个内核引用目标文件的地址,或者是其i节点号。

7.SIZE/OFF:文件大小或偏移值。如果如果该字段显示为0t*0x*,就表示这是一个偏移值,否则就表示这是一个文件大小。对字符设备或FIFO类型的文件定义文件大小没有意义,所以该字段将显示一个偏移值。

9.NODE:文件的i节点号。对于socket,则显示为协议类型,如TCP。

10.NAME:文件名。

如果我们使用telnet命令向websrv服务器发起一个连接,再次执行上图中的lsof命令时,会多输出以下行:
在这里插入图片描述
该输出表示服务器打开了一个IPv4类型的socket,其值为5,且它处于ESTABLISHED状态。该socket对应的连接的本端socket地址是(127.0.0.1, 13579),远端socket地址是(127.0.0.1, 48215)

nc(netcat)命令主要用来快速构建网络连接,我们可以让它以服务器方式运行,监听某个端口并接收客户连接,因此它可用来调试客户端程序,我们也可以使之以客户端方式运行,向服务器发起连接并收发数据,因此它可用来调试服务器程序,此时它有点像telnet程序。

nc命令常用的选项:
1.-i:设置数据包传送的时间间隔。

2.-l:以服务器方式运行,监听指定的端口。nc命令默认以客户端方式运行。

3.-k:保持服务器持续监听,nc不会在客户端连接终止后退出,而是继续保持监听状态,必须与-l选项一起使用。

4.-n:使用IP地址表示主机,而不是主机名;使用数字表示端口号,而不是服务名。即不做任何DNS或服务查找,此时用户需要提供原始IP地址和端口号,使用该选项的情形:
(1)需要快速测试,避免额外的解析带来的时间消耗。

(2)DNS解析不可用时,可以使用IP进行连接。

(3)需要指定特定的地址,避免解析结果带来的不确定性。

5.-p:当nc命令以客户端运行时,强制其使用指定的端口号。

6.-s:设置本地主机发送出的数据包的IP地址。

7.-C:将CR和LF两个字符作为行结束符。

8.-U:使用UNIX本地域协议通信。

9.-u:使用UDP协议。nc命令默认使用的传输层协议是TCP协议。

10.-w:如果nc客户端在指定的时间内未检测到任何输入,则退出。

11.-X:当nc客户端和代理服务器通信时,该选项指定它们之间使用的通信协议,目前nc支持的代理协议有4(SOCKS v.4)、5(SOCKS v.5)、connect(HTTPS proxy),nc默认使用的代理协议是SOCKS v.5。

12.-x:指定目标代理服务器的IP地址和端口号,比如,要连接到ernest-laptop上的squid代理服务器,并通过它来访问www.baidu.com的Web服务,可用以下命令:
在这里插入图片描述
13:-z:扫描目标机器上的某个或某些服务是否开启(端口扫描),比如,要扫描机器ernest-laptop上端口在20~50之间的服务,可用以下命令:
在这里插入图片描述
我们可用以下方式来连接websrv服务器并向它发送数据:
在这里插入图片描述
上图中使用了-C选项,这样我们每次按下回车键向服务器发送一行数据时,nc客户端都会给服务器额外发送一个<CR><LF>,这正是websrv服务器期望的HTTP行结束符。发完第三行数据后,我们得到了服务器的响应,内容正是我们期望的:服务器没有找到被请求的资源文件a.html。

strace跟踪程序运行过程中指定的系统调用和接收到的信号,并将系统调用名、参数、返回值、信号名输出到标准输出或指定文件。

strace命令常用选项包括:
1.-c:统计每个系统调用执行时间、执行次数、出错次数。

2.-f:跟踪由fork函数生成的子进程。

3.-t:在输出的每行信息前加上时间信息。

4.-e:指定一个表达式,用来控制如何跟踪系统调用(或接收到的信号,下同),其格式为:
在这里插入图片描述
qualifier可以是trace、abbrev、verbose、raw、signal、read、write之一,默认是trace。value是用于进一步限制被跟踪的系统调用的符号或数值,它的两个特殊取值时all和none,分别表示跟踪所有由qulifier指定类型的系统调用和不跟踪任何该类型的系统调用。以下是其他value取值:
(1)-e trace=set:只跟踪指定的系统调用。例如-e trace=open, close, read, write表示只跟踪open、close、read、write这4种系统调用。

(2)-e trace=file:只跟踪与文件操作相关的系统调用。

(3)-e trace=process:只跟踪与进程控制相关的系统调用。

(4)-e trace=network:只跟踪与网络相关的系统调用。

(5)-e trace=signal:只跟踪与信号相关的系统调用。

(6)-e trace=ipc:只跟踪与进程间通信相关的系统调用。

(7)-e signal=set:只跟踪指定信号,如-e signal=!SIGIO表示跟踪除SIGIO之外的所有信号。

(8)-e read=set:输出从指定文件中读入的数据,如-e read=3, 5表示输出所有从文件描述符3和5读入的数据。

5.-o:将strace的输出写入指定的文件。

strace命令的每行都包含以下字段:系统调用名、参数、返回值,如下面的实例:
在这里插入图片描述
这行输出表示,程序cat /dev/null在运行过程中执行了open系统调用,open调用以只读方式打开了大文件/dev/null,然后返回了值为3的文件描述符。上图中命令会输出很多内容,我们省略了次要的信息,后面的示例中,我们也仅显示主题相关的内容。

当系统调用发生错误时,strace命令将输出错误标识和描述,如以下示例:
在这里插入图片描述
上图中的O_LARGEFILE并不是POSIX标准的一部分,而是一些UNIX-like操作系统的扩展,它通常用于兼容早期UNIX系统,告诉操作系统要支持大文件(大于2 GB)的访问。

stace命令对不同的参数类型也有不同的输出方式:
1.对于C风格字符串,strace将输出字符串的内容。默认的最大输出长度是32字节,对于过长的部分strace会使用...省略,比如,ls -l命令在运行过程中将读取/etc/passwd文件:
在这里插入图片描述
文件名不被strace当作C风格字符串,其内容总是被完整输出。

2.对于结构体,strace将用{}输出该结构体的每个字段,并用,将每个字段隔开,对于字段较多的结构体,strace将用...省略部分输出,比如:
在这里插入图片描述
上图中的lstat64函数不是标准C库函数,而是一种在一些UNIX-like操作系统上可用的扩展函数,它类似于标准的lstat函数,但支持大文件(大于2 GB)的文件属性查询,以确保文件属性信息能够正确获取和处理。

上面的strace输出显示,lstat64系统调用的第一个参数是字符串参数/dev/null,第二个参数是stat结构体类型的输出参数(指针),strace仅显示了该结构体参数的两个字段:st_mode和st_rdev,当系统调用失败时,输出参数将显示为传入前的值。

3.对于位集合参数(如信号集类型sigset_t),strace将用[]输出该集合中所有被置1的位,并用空格隔开每一项,假设某程序中有以下代码:
在这里插入图片描述
则针对该程序的strace命令将输出以下内容:
在这里插入图片描述
对于其他类型参数的输出方式,可参考strace的man手册。对于程序接收到的信号,strace将输出该信号的值及其描述,比如,我们在一个终端上运行sleep 100命令,然后在另一个终端上使用strace命令跟踪该进程,接着用Ctrl+C终止命令sleep 100以观察strace的输出,具体操作如下:
在这里插入图片描述
在这里插入图片描述
下面考虑一个使用strace命令的完整例子,查看websrv服务器在处理客户连接和数据时使用系统调用的情况,具体操作如下:
在这里插入图片描述
可见,服务器当前正在执行epoll_wait系统调用以等待客户请求,接下来我们使用以上nc命令对服务器发起一个连接并逐行发送HTTP请求,此时strace命令的输出如下所示:
在这里插入图片描述
在这里插入图片描述
上图的输出分为五个部分,我们用空行将每个部分隔开:
1.第一部分从第一次epoll_wait系统调用开始,此次epoll_wait调用检测到了文件描述符3上的EPOLLIN事件,文件描述符3是服务器的监听socket,因此这个事件表示有新客户连接到来,于是websrv服务器对监听socket执行了accept调用,accept返回一个新的连接socket,其值为5,接着,服务器清除这个新socket上的错误,设置其SO_REUSEADDR属性,然后往epoll内核事件表中注册该socket上的EPOLLRDHUP和EPOLLONESHOT两个事件,然后设置新socket为非阻塞的。

2.第二部分从第二次epoll_wait系统调用开始,此次epoll_wait函数检测到了文件描述符5上的EPOLLIN事件,这表示客户端的第一行数据到达了,于是服务器执行了两次recv系统调用来接收数据,第一次recv函数读取到38字节的客户数据,即GET http://localhost/a.html HTTP/1.1\r\n。第二次recv函数失败了,errno是EAGAIN,这表示目前没有更多的客户数据可读。此后服务器调用了futex函数对互斥锁解锁,以唤醒等待互斥锁的线程。可见POSIX线程库中的pthread_mutex_unlock函数在内部调用了futex函数。

3.与2类似。

4.与2类似。

5.epoll_wait函数检测到了文件描述符5上的EPOLLOUT事件,这表示工作线程正确处理了客户请求,并准备好了待发送的数据,因此主线程开始执行writev系统调用往客户端写入HTTP应答,最后,服务器从epoll内核事件表中移除文件描述符5上的所有注册事件,并关闭该文件描述符。

netstat可以打印本地网卡接口上的全部连接、路由表信息、网卡接口信息等,本书主要使用上述功能中的第一个,即显示TCP连接及其状态信息,毕竟,要想获得路由表信息和网卡接口信息,我们可以使用输出内容更丰富的route(管理和显示系统的网络路由表的命令)和ifconfig命令。

netstat命令常用选项:
1.-n:使用IP地址表示主机,而不是主机名;使用数字表示端口号,而不是服务名。

2.-a:也显示监听socket。

3.-t:仅显示TCP连接。

4.-r:显示路由信息。

5.-i:显示网卡接口的数据流量。

6.-c:每隔1秒输出一次。

7.-o:显示socket定时器(如保活定时器)的信息。

8.-p:显示socket所属的进程的PID和名字。

运行websrv服务器,并执行telnet命令对它发起一个连接请求:
在这里插入图片描述
然后执行netstat -nat | grep 127.0.0.1:13579来查看连接状态,结果如下:
在这里插入图片描述
由上图,netstat的每行输出都包含以下6个字段(默认情况):
1.Proto:协议名。

2.Recv-Q:socket内核接收缓冲区中尚未被应用进程读取的数据量。

3.Send-Q:未被对方确认的数据量。

4.Local Address:本端的IP和端口号。

5.Foreign Address:对方的IP地址和端口号。

6.State:socket的状态。对于无状态协议,如UDP,这一列将显示为空。对于面向连接的协议,netstat支持的State包括ESTABLISHED、SYN_SENT、SYN_RCVD、FIN_WAIT1、FIN_WAIT2、TIME_WAIT、CLOSE、CLOSE_WAIT、LAST_ACK、LISTEN、CLOSING、UNKNOWN。

上图的输出中,第1行表示本地socket地址127.0.0.1:13579处于LISTEN状态,并等待任何远端socket(用0.0.0.0:*表示)对它发起连接。第2行表示服务器和远端地址127.0.0.1:48220建立了一个连接。第3行是从客户端角度重复输出第2行信息表示的这个连接,因为我们是在同一台机器上运行服务器和客户端的。

vmstat(virtual memory statistics)命令能实时输出系统的各种资源的使用情况,如进程信息、内存使用、CPU使用率、IO使用情况。

vmstat命令常用选项:
1.-f:显示系统自启动以来执行的fork次数。

2.-s:显示内存相关的统计信息及多种系统活动的数量(如CPU上下文切换次数)。

3.-d:显示磁盘相关的统计信息。

4.-p:显示磁盘分区的统计信息。

5.-S:使用指定单位来显示。参数k、K、m、M分别代表1000、1024、1000000、1048576字节。

6.delay:采样间隔(单位是秒),即每隔delay的时间输出一次统计信息。

7.count:采样次数,输出count次统计信息。

默认vmstat命令的输出:
在这里插入图片描述
第1行输出是自系统启动以来的平均结果,而后面的输出是采样间隔内的平均结果。vmstat命令的每条输出都包含6个字段,它们的含义分别是:
1.procs:进程信息。r表示等待运行的进程数;b表示处于不可中断睡眠状态的进程数(即它们在等待进程IO)。

2.memory:内存信息。各项的单位都是KB。swpd表示虚拟内存的使用量。free表示空闲内存的使用量。buff表示作为buffer cache的内存数量,其中包含原始磁盘块(从磁盘读入的数据可能被保持在buffer cache中,以便下一次快速访问)。cache表示作为page cache的内存数量,待写入磁盘的数据首先被放到page cache中,然后由磁盘中断程序写入磁盘。

3.swap:交换分区(虚拟内存)的使用信息,各项的单位是KB/s。si表示数据由磁盘交换至内存的速率。so表示数据由内存交换至磁盘的速率。如果这两个值经常变化,说明内存不足。

4.io:块设备的使用信息,单位是block/s。bi表示从块设备读入块的速率。bo表示向块设备写入块的速率。

5.system:系统信息。in表示每秒发生的中断次数。cs表示每秒发生的上下文切换(进程切换)次数。

6.cpu:CPU使用信息。us表示系统所有进程运行在用户空间的时间占CPU总运行时间的比例。sy表示系统所有进程运行在内核空间的时间占CPU总运行时间的比例。id表示CPU处于空闲状态的时间占CPU总运行时间的比例。wa表示CPU等待IO事件的时间占CPU总运行时间的比例。

我们可用iostat命令获得磁盘使用情况的更多信息,也能使用mpstat命令获得CPU使用情况的更多信息,vmstat命令主要用于查看系统内存的使用情况。

ifstat(interface statistics)命令可用于监测网络流量,其常用选项如下:
1.-a:监测系统上所有网卡接口。

2.-i:指定要监测的网卡接口。

3.-t:在每行输出信息前加上时间戳。

4.-b:以Kbit/s为单位显示数据,而不是默认的KB/s。

5.delay:采样间隔,单位是秒,即每隔delay时间输出一次统计信息。

6.count:采样次数,即总共输出count次统计信息。

ifstat命令的例子:
在这里插入图片描述
从输出来看,该主机拥有两个网卡接口:虚拟的回路接口lo和以太网网卡接口eth0。使用ifstat命令可以大概估计各个时段服务器的总输入、输出流量。

mpstat(multi-processor statistics)命令能实时监测多处理器系统上每个CPU的使用情况。mpstat命令和iostat命令通常都集成在包sysstat中,安装sysstat即可获得这两个命令。mpstat命令的典型用法如下:
在这里插入图片描述
选项P指定要监听的CPU号(0~CPU个数-1),其值ALL表示监听所有CPU。interval参数是采样间隔,单位是秒,即每个interval的时间输出一次统计信息。count参数是采样次数,即共输出count次统计信息,但mpstat命令最后还会输出这count次采样结果的平均值。与vmstat命令一样,mpstat命令输出的第一次结果是自系统启动以来的平均结果,而后面的输出结果则是采样间隔内的平均结果。

使用mpstat命令的例子:
在这里插入图片描述
为显示方便,我们省略了每行输出的前导时间戳。每次采样的输出都包含3条信息,每条信息包含以下几个字段:
1.CPU:指示该条信息是哪个CPU的数据。0表示第1个CPU的数据,1表示第2个CPU的数据,all是这两个CPU数据的平均值。

2.%usr:除了nice值为负的进程,系统上其他进程运行在用户空间的时间占CPU总运行时间的比例。

3.%nice:nice值为负的进程运行在用户空间的时间占CPU总运行时间的比例。

4.%sys:系统上所有进程运行在内核空间的时间占CPU总运行时间的比例,但不包括硬件和软件中断消耗的CPU时间。

5.%iowait:CPU等待磁盘操作的时间占CPU总运行时间的比例。

6.%irq:CPU用于处理硬件中断的时间占CPU总运行时间的比例。

7.%soft:CPU用于处理软件中断的时间占CPU总运行时间的比例。

8.%steal:一个物理CPU可以包含一对虚拟CPU,这一对虚拟CPU由超级管理程序管理。当超级管理程序在处理某个虚拟CPU时,另外一个虚拟CPU必须等待它处理完成才能运行,这部分等待事件就是steal时间,该字段表示steal时间占CPU总运行时间的比例。

9.%guest:运行虚拟CPU的时间占总运行时间的比例。

10.%idle:系统空闲的时间占CPU总运行时间的比例。

在以上所有输出字段中,我们最关心的是%user、%sys、%idle,它们基本反映了我们的代码中业务逻辑代码和系统调用所占的比例,以及系统还能承受多大的负载。上图输出中,执行系统调用占用的CPU时间比执行用户业务逻辑占用的CPU时间要多,这是因为我们运行了第十六章中的压力测试工具,它在不停地执行recv/send系统调用来收发数据。

相关文章:

Linux高性能服务器编程 学习笔记 第十七章 系统监测工具

tcpdump是一款经典的抓包工具&#xff0c;即使今天我们已经有了像Wireshark这样更易于使用和掌握的抓包工具&#xff0c;tcpdump仍是网络程序员的必备利器。 tcpdump提供了一些选项用以过滤数据包或定制输出格式&#xff0c;常见的选项如下&#xff1a; 1.-n&#xff1a;使用I…...

rabbitmq 消费者报错 ListenerExecutionFailedException NullPointerException

报错信息&#xff1a; org.springframework.amqp.rabbit.support.ListenerExecutionFailedException: Listener method private void com.xxx.service.impl.xxxServiceImpl.xxx(com.xxx.dto.XXX) threw exception at org.springframework.amqp.rabbit.listener.adapter.Mes…...

Java面试题:链表-合并两个排序的链表

描述 输入两个递增的链表&#xff0c;单个链表的长度为n&#xff0c;合并这两个链表并使新链表中的节点仍然是递增排序的。 示例 输入&#xff1a; {1,3,5}, {2,4,6}返回值&#xff1a; {1,2,3,4,5,6}原题地址&#xff1a;https://www.nowcoder.com/practice/d8b6b4358f7742…...

Springboot结合Mockito写单元测试实践和原理

文章目录 前言一、使用最佳实践使用场景SpyBean失效场景解决Mock失效的问题避免FactoryBean的实现方式使用MockBean&#xff0c;但是要指定name 个人推荐 二、原理1. MockBean2.SpyBean方法调用 总结 前言 相信看我博客的都是javaer&#xff0c;工作中一般都是使用Springboot框…...

操作系统之微内核架构

宏内核相反&#xff0c;微内核架构提倡功能尽可能少&#xff0c;只提供进程调度、处理中断、内存映射、进程间通信等功能。微内核架构是不能够提供什么实际功能的&#xff0c;而内存管理、进程管理、设备管理和文件管理服务等&#xff0c;都被做成一个个服务进程&#xff0c;它…...

24---WPF缓存

一、什么是缓存&#xff1a; 1.缓存指的是将需要频繁访问的网络内容存放在离用户较近、访问速度更快的系统中&#xff0c;以提高内容访问速度的一种技术。缓存服务器就是存放频繁访问内容的服务器。 2.缓存就是一个临时存放区域--离用户比较近 二、作用--意义---如果系统出现故…...

vite+vue3.0 使用tailwindcss

参考资料&#xff1a; 安装 - TailwindCSS中文文档 | TailwindCSS中文网 npm install -D tailwindcss npm install postcss npm install autoprefixer npx tailwindcss init -p 生成/src/tailwind.config.js和/src/postcss.config.js配置文件 在/src/tailwind.config.js配置文件…...

C++QT---QT-day3

使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是否为&…...

小程序如何搭建在服务器上

小程序可以通过搭建在服务器上&#xff0c;来实现跨平台的访问和使用。以下是搭建小程序在服务器上的步骤&#xff1a; 安装Node.js&#xff1a;首先&#xff0c;你需要在服务器上安装Node.js。你可以从Node.js的官方网站下载并安装。 安装微信开发者工具&#xff1a;然后&…...

JavaEE初阶学习:Servlet

1.Servlet 是什么 Servlet 是一种 Java 程序&#xff0c;用于在 Web 服务器上处理客户端请求和响应。Servlet 可以接收来自客户端&#xff08;浏览器、移动应用等&#xff09;的 HTTP 请求&#xff0c;并生成 HTML 页面或其他格式的数据&#xff0c;然后将响应发送回客户端。S…...

黑白二维码不好看,那么快学习改色的方法吧

现在经常会看到很多的二维码不是黑白图案&#xff0c;可以是其他纯色或者渐变色等样式的&#xff0c;那么怎么将黑白二维码改成其他鲜艳好看的颜色呢&#xff1f;一般想要修改普通样式的二维码可以用二维码美化生成器来处理&#xff0c;只需要上传二维码图片&#xff0c;就可以…...

coreldraw2024版本有哪些新增功能?

有小伙伴在用电脑查找软件程序的时候&#xff0c;看到了一款叫cdr软件的应用&#xff0c;自己之前没接触过&#xff0c;不知道cdr是什么软件&#xff1f;cdr软件是干什么的&#xff1f;十分好奇。其实它是一款平面设计软件&#xff0c;下面就给大家介绍下相关的cdr软件的知识。…...

2023最新Office2021专业增强版安装使用教程

Microsoft Office专业增强版2021是一套办公软件套装&#xff0c;包含了Word、Excel、PowerPoint、Outlook、Access、Publisher、OneNote、Teams等应用程序。这个版本是在Office 365的基础上推出的新版本&#xff0c;与之前的Office版本相比&#xff0c;增强了许多功能。也是目前…...

实时配送跟踪功能的实现:外卖跑腿小程序的技术挑战

在当今数字化时代&#xff0c;外卖和跑腿服务已经成为了生活中不可或缺的一部分。为了提供更好的用户体验&#xff0c;外卖跑腿小程序越来越注重实时配送跟踪功能的实现。这项技术挑战旨在确保顾客可以方便地跟踪他们的订单&#xff0c;以及配送员可以高效地完成送货任务。本文…...

react实现一维表格、键值对数据表格key value表格

UI画的需求很抽象&#xff0c;直接把数据铺开&#xff0c;不能直接用antd组件了 上一行是name&#xff0c;下一行是value&#xff0c;总数不定&#xff0c;最后前端还要显示求和 class OneDimensionTable extends React.Component { render() {const { data } this.props;le…...

个人微信CRM客户管理系统怎么选?功能介绍

现在市面上有许多种类的个人微信CRM客户管理系统可供选择&#xff0c;因此&#xff0c;我们需要选择最适合自己需求的微信管理系统CRM&#xff0c;最重要的是根据您的需求和期望的功能来进行筛选。 如何选择适合自己的微信CRM客户管理系统&#xff1f; 现在市面上的系统五花八…...

Mac Intellij Idea get/set方法快捷键

Control Retrun(回车键) Command n 参考&#xff1a; Mac Intellij Idea get/set方法快捷键-CSDN博客...

并发程序设计

一、进程的创建和回收 一、进程的概念 1、进程&#xff01;程序 程序是静态的&#xff0c;而进程是动态的 2、进程和程序的区别 1&#xff09;进程控制块中包含进程的属性 2&#xff09;程序在磁盘里面&#xff0c;堆栈都是在内存中&#xff0c;程序运行起来都在内存中 3…...

openGauss学习笔记-104 openGauss 数据库管理-管理数据库安全-客户端接入之SSL证书管理-证书替换

文章目录 openGauss学习笔记-104 openGauss 数据库管理-管理数据库安全-客户端接入之SSL证书管理-证书替换104.1 操作场景104.2 前提条件104.3 注意事项104.4 操作步骤 openGauss学习笔记-104 openGauss 数据库管理-管理数据库安全-客户端接入之SSL证书管理-证书替换 openGaus…...

react仿照antd progress实现可自定义颜色的直角矩形进度条

可传颜色、带滑块的直角进度条 很歹毒的UI设计&#xff08;真的很丑&#xff09; 实现&#xff1a; class RankProgress extends React.Component {render() {const { percent, progressColor } this.props;return (<div className{styles.progress}><div classNam…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...