当前位置: 首页 > 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…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

Unity UGUI Button事件流程

场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...