百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

如何在 1 分钟内快速展开 Linux 性能分析?

liebian365 2024-10-19 07:59 20 浏览 0 评论

1. 写在前面

当 Linux 系统存在性能问题时,如何在最短时间内获取系统性能摘要及定位瓶颈?


本文将围绕问题,介绍如何通过标准 Linux 工具快速查找、分析系统错误、资源饱和度(指资源负载超过其处理能力),全文涉及的命令输出都很容易理解,有助于快速评估系统性能和资源利用率。

指令

描述

uptime

报告系统正常运行时间;

dmesg | tail

显示系统内核的日志信息;

vmstat

报告虚拟内存统计信息;

mpstat -P ALL 1

报告处理器静态数据;

pidstat 1

报告全部/指定 进程 CPU、内存等统计信息;

iostat -xz 1

报告 CPU、磁盘 I/O 和 NFS 统计信息;

free -m

显示系统可用/已用内存;

sar -n DEV 1

系统运行状态统计工具;

sar -n TCP,ETCP 1

/

top

显示系统各个进程资源占用;

其中一些命令需要安装 sysstat 软件包(ubuntu:apt-get install sysstat)。

下文将总结这些命令,并通过示例,解释如何通过指标进行性能分析。

2. 性能分析工具集

2.1 uptime

uptime 是一个查看系统负载平均值的快速方法,当用于分析 Linux 性能瓶颈时,主要关注系统的运行时间、当前登录用户数量以及负载平均值。负载平均值是关键指标,它显示系统在过去 1 分钟、5 分钟和 15 分钟内的平均负载。

root@jpzhang-dev:~# uptime
 10:55:34 up 17 days,  1:30,  2 users,  load average: 0.18, 0.07, 0.02

输出解释

  • 10:55:34:当前时间;
  • up 17 days, 1:30:系统已运行的时间,这里表示系统已经连续运行了 17 天 1 小时 30 分钟;
  • 2 users:当前登录到系统的用户数量;
  • load average: 0.18, 0.07, 0.02:系统的负载平均值,分别表示最近 1 分钟、5 分钟和 15 分钟的平均负载。

负载分析

  • 单核系统(假设系统有 1 个 CPU 核心):
    • load average: 1.0 表示系统完全忙碌;
    • load average: >1.0 表示系统超负荷运行,可能存在性能瓶颈;
  • 多核系统(假设系统有 4 个 CPU 核心):
    • load average: 4.0 表示系统完全忙碌;
    • load average: >4.0 表示系统超负荷运行,可能存在性能瓶颈;
  • 负载趋势:
    • 如果 1 分钟的负载明显高于 5 分钟和 15 分钟的负载,表示系统负载最近增加;
    • 如果 1 分钟的负载明显低于 5 分钟或者 15 分钟,表示系统负载降低,可以查看过去一段时间系统情况分析瓶颈;
    • 如果 5 分钟和 15 分钟的负载都很高,表示系统长时间负载过高;

2.2 dmesg | tail

通常用于查看启动信息、硬件错误和内核调试消息;

root@jpzhang-dev:~# dmesg | tail
[1880957.563150] perl invoked oom-killer: gfp_mask=0x280da, order=0, oom_score_adj=0
[...]
[1880957.563400] Out of memory: Kill process 18694 (perl) score 246 or sacrifice child
[1880957.563408] Killed process 18694 (perl) total-vm:1972392kB, anon-rss:1953348kB, file-rss:0kB
[2320864.954447] TCP: Possible SYN flooding on port 7001. Dropping request.  Check SNMP counters.

如果存在内核日志,通过上述命令可查看最近 10 条系统信息,用于查找可能导致性能问题的错误,例如上述输出包括 oom-killer 和 TCP 丢弃请求。

2.3 vmstat

vmstat 是虚拟内存统计(virtual memory stat)的简称, 显示系统各种性能指标,包括内存使用情况、CPU、进程、块 I/O 等。

可以指定间隔时间(秒)和报告次数。例如,每秒报告一次,共报告五次:

root@jpzhang-dev:~# vmstat 1 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 10905632 222008 11675420    0    0     0     3    1    1  1  0 99  0  0
 0  0      0 10905632 222008 11675420    0    0     0     0 2992 3643  1  0 99  0  0
 0  0      0 10905560 222008 11675420    0    0     0     0 1273 2433  0  0 100  0  0
 0  0      0 10905560 222008 11675420    0    0     0  1400 1409 2512  0  0 99  0  0
 0  0      0 10905560 222008 11675420    0    0     0     0 1248 2397  0  0 100  0  0

关键指标分析

  • procs(进程)
    • r:运行队列中的进程数(等待运行的进程数)如果这个数值大于系统的 CPU 核心数,说明系统 CPU 过载;
    • b:不可中断睡眠状态的进程数,高值可能表示 I/O 问题或资源争用;
  • memory(内存)
    • swpd:已使用的交换内存,高值表示物理内存不足,系统正在使用交换内存;
    • free:空闲内存,低值可能表示内存使用过高;
    • buff & cache:用作缓冲区和缓存的内存。一般情况下,系统会尽量使用可用内存进行缓存,以提高性能;
  • swap(交换)
    • si:从磁盘交换到内存的交换输入量(swap in);
    • so:从内存交换到磁盘的交换输出量(swap out); si 和 so:非零值表示系统正在使用交换内存,由于物理内存不足导致。高的 si 或 so 值表示内存不足,需要增加物理内存或减少内存消耗。
  • io(I/O)
    • bi:块设备的块输入量(块读取);
    • bo:块设备的块输出量(块写入); 高值表示大量的磁盘 I/O 操作,可能存在磁盘瓶颈;
  • system(系统)
    • in:每秒的中断数,包括时钟中断,高值可能表示硬件或驱动程序问题;
    • cs:每秒的上下文切换数,高值可能表示进程间的频繁切换,通常与高 r 值有关;
  • cpu
    • us:用户态的 CPU 时间百分比,高值表示用户进程消耗大量 CPU 资源,如果系统整体运行良好,这不一定是问题;
    • sy:内核态的 CPU 时间百分比,高值表示内核进程消耗大量 CPU 资源,如果超过 20%,需要进一步分析内核的 I/O 处理效率,可能需要优化内核配置或硬件;
    • id:空闲的 CPU 时间百分比,低值表示 CPU 使用率高;
    • wa:等待 I/O 的 CPU 时间百分比,恒定高值表示 CPU 大部分时间在等待 I/O 操作,可能存在磁盘瓶颈,这意味着 CPU 大部分时间处于空闲状态,因为任务在等待磁盘 I/O 时被阻塞;
    • st:被虚拟机使用的 CPU 时间百分比,高值表示虚拟化环境中,宿主机的资源不足;

2.4 mpstat -P ALL 1

用于监控和报告各个 CPU 的使用情况。使用 mpstat -P ALL 1 命令,可以每秒打印一次所有 CPU 的详细使用情况,这对于检查 CPU 使用是否存在不平衡以及识别单个 CPU 过热问题非常有帮助。

以下是该命令的具体使用和输出解释:

root@jpzhang-dev:~# mpstat -P ALL 1
Linux 5.4.0-186-generic (jpzhang-dev)   07/01/24        _x86_64_        (16 CPU)

14:52:45     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
14:52:46     all    0.31    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.69
14:52:46       0    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
14:52:46       1    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
14:52:46       2    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
14:52:46       3    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
14:52:46       4    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
14:52:46       5    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
14:52:46       6    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
14:52:46       7    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
14:52:46       8    1.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.00
14:52:46       9    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
14:52:46      10    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
14:52:46      11    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
14:52:46      12    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
14:52:46      13    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
14:52:46      14    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
14:52:46      15    4.08    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   95.92

输出解释

  • CPU:CPU ID 及所有 CPU 的总和(all);
  • %usr:用户态 CPU 使用率(不包括 nice 优先级);
  • %nice:nice 优先级用户态 CPU 使用率;
  • %sys:内核态 CPU 使用率;
  • %iowait:CPU 等待 I/O 操作时间百分比;
  • %irq:硬中断处理时间百分比;
  • %soft:软中断处理时间百分比;
  • %steal:虚拟机窃取的 CPU 时间百分比;
  • %guest:虚拟 CPU 时间百分比;
  • %gnice:虚拟机中 nice 优先级 CPU 时间百分比;
  • %idle:CPU 空闲时间百分比;

负载分析

  • 检查各 CPU 的使用情况
  • 通过比较不同 CPU 的 %usr、%sys 和 %idle 值,可以判断是否存在负载不均衡。
  • 例如:
  • 如果某个 CPU 的 %usr 或 %sys 明显高于其他 CPU,这可能表示单线程应用程序正在占用该 CPU。高的 %iowait 值表示该 CPU 正在等待 I/O 操作,可能存在磁盘或网络瓶颈。如果某个 CPU 的 %idle 值明显低于其他 CPU,说明该 CPU 比其他 CPU 更忙。
  • 识别单个 CPU 过热单个 CPU 使用率高(例如 %usr 或 %sys 高于 80%)可以判断单线程应用程序,对于多核系统,这种情况可能导致该 CPU 过热,从而影响整体性能。
  • 系统整体负载情况查看 all 行的数据,可以了解整个系统的平均 CPU 使用情况。结合单个 CPU 的数据,可以更全面地了解系统负载是否均衡。

2.5 pidstat 1

pidstat 命令有点类似 top,用于报告各个进程的统计信息,但它打印的是滚动摘要而不是清屏。这对观察一段时间内的模式很有用。

pidstat 命令的基本语法如下:

pidstat [options] [interval [count]]
  • interval:每次采样的时间间隔(以秒为单位);
  • count:采样的次数;

常用选项:

  • -u:报告 CPU 使用情况;包括用户态、系统态、虚拟机等,关键指标如下:
    • %usr:用户态 CPU 时间百分比;
    • %system:系统态 CPU 时间百分比;
    • %guest:虚拟 CPU 时间百分比;
    • %CPU:总的 CPU 使用时间百分比;
  • -r:报告内存使用情况;关键指标如下:
    • minflt/s:每秒次级页面错误数;
    • majflt/s:每秒主要页面错误数;
    • VSZ:虚拟内存大小;
    • RSS:常驻集大小;
    • %MEM:内存使用百分比;
  • -d:报告 I/O 使用情况;关键指标如下:
    • kB_rd/s:每秒读取的 KB 数;
    • kB_wr/s:每秒写入的 KB 数;
    • kB_ccwr/s:每秒取消的写入 KB 数;
  • -p :指定一个或多个进程 ID;
  • -h:显示柱状图格式的输出;
root@jpzhang-dev:~# pidstat -r 1
Linux 5.4.0-186-generic (jpzhang-dev)   07/01/24        _x86_64_        (16 CPU)

07:41:02 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
07:41:03 PM     0         9    0.00    0.94    0.00    0.94     1  rcuos/0
07:41:03 PM     0      4214    5.66    5.66    0.00   11.32    15  mesos-slave
07:41:03 PM     0      4354    0.94    0.94    0.00    1.89     8  java
07:41:03 PM     0      6521 1596.23    1.89    0.00 1598.11    27  java
07:41:03 PM     0      6564 1571.70    7.55    0.00 1579.25    28  java
07:41:03 PM 60004     60154    0.94    4.72    0.00    5.66     9  pidstat

07:41:03 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
07:41:04 PM     0      4214    6.00    2.00    0.00    8.00    15  mesos-slave
07:41:04 PM     0      6521 1590.00    1.00    0.00 1591.00    27  java
07:41:04 PM     0      6564 1573.00   10.00    0.00 1583.00    28  java
07:41:04 PM   108      6718    1.00    0.00    0.00    1.00     0  snmp-pass
07:41:04 PM 60004     60154    1.00    4.00    0.00    5.00     9  pidstat

上面示例,可以分析确认消耗 CPU 的两个 java 进程,%CPU 列是所有 CPU 的总和;1591% 表明该 java 进程消耗了近 16 个 CPU。

2.6 iostat -xz 1

用于监控系统输入/输出设备性能统计信息。使用 iostat -xz 1 命令,可以每秒钟输出一次所有设备的详细性能指标。

iostat -xz 1
  • -x:显示扩展的 I/O 统计信息,包括每个设备的 I/O 速率和延迟等详细信息;
  • -z:忽略所有零活动的设备;
  • 1:每秒钟刷新一次输出;
root@jpzhang-dev:~# iostat -xz 1
Linux 5.4.0-186-generic (jpzhang-dev)   07/01/24        _x86_64_        (16 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.56    0.00    0.75    0.00    0.00   98.68

Device            r/s     rkB/s   rrqm/s  %rrqm r_await rareq-sz     w/s     wkB/s   wrqm/s  %wrqm w_await wareq-sz     d/s     dkB/s   drqm/s  %drqm d_await dareq-sz  aqu-sz  %util
vda              0.00      0.00     0.00   0.00    0.00     0.00   12.00     88.00    13.00  52.00    0.33     7.33    0.00      0.00     0.00   0.00    0.00     0.00    0.00   1.20

平均 CPU 使用情况:

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.44    0.00    0.13    0.00    0.00   99.44

指标与上文类似,这里不在继续说明。

设备使用情况:

Device            r/s     rkB/s   rrqm/s  %rrqm r_await rareq-sz     w/s     wkB/s   wrqm/s  %wrqm w_await wareq-sz     d/s     dkB/s   drqm/s  %drqm d_await dareq-sz  aqu-sz  %util
vda              0.00      0.00     0.00   0.00    0.00     0.00   12.00     88.00    13.00  52.00    0.33     7.33    0.00      0.00     0.00   0.00    0.00     0.00    0.00   1.20
  • r/s:每秒读取请求数;
  • w/s:每秒写入请求数;高 r/s 和 w/s 值表示大量的 I/O 活动,可能是由于应用程序高负载或数据库操作引起;
  • rkB/s:每秒读取的千字节数;
  • wkB/s:每秒写入的千字节数;高 rkB/s 和 wkB/s 值表示大量的数据传输,可能是大文件操作或数据备份等;
  • rrqm/s:每秒合并的读取请求数;
  • wrqm/s:每秒合并的写入请求数;
  • r_await:读取请求的平均等待时间(毫秒);
  • w_await:写入请求的平均等待时间(毫秒);高 r_await 和 w_await 值表示 I/O 请求的等待时间较长,可能是磁盘速度慢或 I/O 请求过多阻塞导致的;
  • svctm:请求的平均服务时间(毫秒);
  • %util:设备利用率,即设备在处理 I/O 请求所花费的时间百分比,值大于 60% 通常会导致性能不佳,但这取决于设备,接近 100% 通常表示饱和;

【注意】对于一个逻辑磁盘而言,其面向多个后端物理磁盘,100% 的利用率并不一定表示所有的后端磁盘都已经达到了饱和状态。这是因为逻辑磁盘可以并行地将 I/O 请求分发到多个后端磁盘上,即使一个后端磁盘已经满负荷运行,其他磁盘可能仍有处理能力。

磁盘 I/O 性能不佳不一定是应用程序本身的问题。通常,系统会采用多种技术来优化磁盘 I/O 的处理,这些技术可以显著减少应用程序因为 I/O 操作而发生的阻塞和延迟,例如:异步 I/O、预读取(Prefetching)、写入缓冲(Write Buffering)、文件系统缓存等。

2.7 free -m

root@jpzhang-dev:~# free -m
             total       used       free     shared    buffers     cached
Mem:        245998      24545     221453         83         59        541
-/+ buffers/cache:      23944     222053
Swap:            0          0          0
  • buffers:用于块设备 I/O 的缓冲区缓存;
  • cached:用于文件系统的页面缓存;

buffers 和 cached 接近零:这可能意味着系统正在频繁地从磁盘读取数据,而不是从缓存中读取。这种情况通常会导致更高的磁盘 I/O,从而影响系统性能(使用 iostat 命令确认磁盘 I/O)。

如果系统上使用 ZFS 文件系统,内存使用输出可能会更加复杂。ZFS 有自己的文件系统缓存,free -m 的输出可能无法准确反映这些缓存。

2.8 sar -n DEV 1

有效地监控网络接口的吞吐量,并评估是否达到了网络限制;

sar -n DEV 1

该命令每秒钟显示一次网络设备的统计信息,直到你停止它(通常通过按 Ctrl+C)。

root@jpzhang-dev:~# sar -n DEV 1
Linux 5.4.0-186-generic (jpzhang-dev)   07/01/24        _x86_64_        (16 CPU)

12:00:01 AM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
12:00:02 AM      eth0   3000.00   4000.00   22000.00   28000.00      0.00      0.00      0.00
12:00:02 AM      eth1   1500.00   1800.00   10000.00   12000.00      0.00      0.00      0.00
  • IFACE:网络接口名称(例如,eth0,lo);
  • rxpck/s:每秒接收的数据包数;
  • txpck/s:每秒发送的数据包数;
  • rxkB/s:每秒接收的千字节数;
  • txkB/s:每秒发送的千字节数;
  • rxcmp/s:每秒接收的压缩数据包数;
  • txcmp/s:每秒发送的压缩数据包数;
  • rxmcst/s:每秒接收的多播数据包数;

负载分析

  • 计算网络接口吞吐量
    • 接收速率(rxkB/s):22000 kB/s
    • 发送速率(txkB/s):28000 kB/s
    • eth0:
  • 换算为 Mbits/sec
    • 28000 kB/s = 28000 * 8 = 224000 Kbits/s = 224 Mbits/s
    • 22000 kB/s = 22000 * 8 = 176000 Kbits/s = 176 Mbits/s
    • 接收速率:
    • 发送速率:
  • 比较与网络限制
  • 假设 eth0 接口的最大带宽是 1 Gbit/s:1 Gbit/s = 1000 Mbits/s

综上,在这个例子中:eth0 接收速率:176 Mbits/s(远低于 1 Gbit/s),eth0 发送速率:224 Mbits/s(远低于 1 Gbit/s)。

结论:eth0 的接收速率和发送速率都远低于 1 Gbit/s 的限制,因此没有达到网络接口的带宽限制。

2.9 sar -n TCP,ETCP 1

监控 TCP 协议和扩展 TCP 统计信息;

root@jpzhang-dev:~# sar -n TCP,ETCP 1
Linux 5.4.0-186-generic (jpzhang-dev)   07/01/24        _x86_64_        (16 CPU)

16:22:32     active/s passive/s    iseg/s    oseg/s
16:22:33         4.00      0.00      9.00      9.00

16:22:32     atmptf/s  estres/s retrans/s isegerr/s   orsts/s
16:22:33         4.00      0.00      0.00      0.00      4.00

关键 TCP 指标:

TCP 统计信息:* active/s:每秒本地(主动)启动的 TCP 连接数;* passive/s:每秒远程(被动)启动的 TCP 连接数;* iseg/s:每秒接收到的 TCP 段数;* oseg/s:每秒发送的 TCP 段数;

扩展 TCP 统计信息:* atmptf/s:每秒尝试失败的 TCP 连接数;* estres/s:每秒重置的 TCP 连接数;* retrans/s:每秒重传的 TCP 段数;* isegerr/s:每秒接收到的错误 TCP 段数;* oseg/s:每秒发送的 TCP 段数;

负载分析

  • 检查 TCP 连接的活跃性(active/s 和 passive/s):
  • active/s 指发起的连接数。如果该值很高,表示有大量的客户端发起连接请求。passive/s 指接收的连接数。如果该值很高,表示服务器处理了大量的连接请求。
  • 检查 TCP 传输情况(iseg/s 和 oseg/s)
  • iseg/s 和 oseg/s:高值可能表示有大量的数据在传输,可能会导致网络拥塞。
  • 检查 TCP 错误和重传
    • atmptf/s:尝试失败的连接数。如果该值不为零,表示有连接失败的情况,可能是由于网络问题或服务器负载过高。
    • estres/s:被重置的连接数。如果该值很高,表示有大量的连接被重置,可能是由于网络不稳定或防火墙配置问题。
    • retrans/s:重传的 TCP 段数。如果该值很高,可能是网络不可靠(如公共互联网),也可能是服务器负载过重而丢弃数据包。
    • isegerr/s:接收到的错误 TCP 段数。如果该值不为零,表示有错误的 TCP 段被接收,可能是网络问题或硬件故障导致。

2.10 top

top - 16:35:41 up 17 days,  7:11,  1 user,  load average: 0.01, 0.12, 0.12
任务: 433 total,   1 running, 432 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.4 us,  0.2 sy,  0.0 ni, 99.4 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :  32098.5 total,  10438.8 free,   9969.2 used,  11690.5 buff/cache
MiB Swap:      0.0 total,      0.0 free,      0.0 used.  21147.5 avail Mem

 进程号 USER      PR  NI    VIRT    RES    SHR    %CPU  %MEM     TIME+ COMMAND
  75809 jpzhang    20   0   16.2g   5.4g 591776 S   6.3  17.1   1223:07 java
    971 root      20   0 2191672 109964  13420 S   4.0   0.3 633:54.87 sys-layer
 175431 jpzhang    20   0   33.4g 560984 342044 S   1.0   1.7  49:51.25 msedge
 234474 root      20   0   12836   4512   3400 R   0.7   0.0   0:00.05 top
    691 root      rt   0  280136  17948   8208 S   0.3   0.1   2:42.47 multipathd
   1708 systemd+  20   0   32528   7240   4600 S   0.3   0.0  54:44.43 redis-server
   5486 jpzhang    20   0 1168024 120840  68096 S   0.3   0.4  16:53.62 gnome-terminal-
 201216 jpzhang    20   0   85172  69092  18868 S   0.3   0.2   7:07.83 python3.12
 226452 root      20   0       0      0      0 I   0.3   0.0   0:00.19 kworker/3:2-events
 233760 jpzhang    20   0 1157.3g 108848  72612 S   0.3   0.3   0:07.15 msedge
      1 root      20   0  170004  13668   8612 S   0.0   0.0   0:34.54 systemd
      2 root      20   0       0      0      0 S   0.0   0.0   0:00.36 kthreadd
      3 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_gp
      4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_par_gp

top 命令整合了我们之前检查过的多个性能指标,缺点是,它不支持滚动输出,这意味着无法持续查看历史数据,而是只能显示当前的系统状态。

感谢您花时间阅读文章!

关注公众号不迷路!

相关推荐

“版本末期”了?下周平衡补丁!国服最强5套牌!上分首选

明天,酒馆战棋就将迎来大更新,也聊了很多天战棋相关的内容了,趁此机会,给兄弟们穿插一篇构筑模式的卡组推荐!老规矩,我们先来看10职业胜率。目前10职业胜率排名与一周前基本类似,没有太多的变化。平衡补丁...

VS2017 C++ 程序报错“error C2065:“M_PI”: 未声明的标识符"

首先,程序中头文件的选择,要选择头文件,在文件中是没有对M_PI的定义的。选择:项目——>”XXX属性"——>配置属性——>C/C++——>预处理器——>预处理器定义,...

东营交警实名曝光一批酒驾人员名单 88人受处罚

齐鲁网·闪电新闻5月24日讯酒后驾驶是对自己和他人生命安全极不负责的行为,为守护大家的平安出行路,东营交警一直将酒驾作为重点打击对象。5月23日,东营交警公布最新一批饮酒、醉酒名单。对以下驾驶人醉酒...

Qt界面——搭配QCustomPlot(qt platform)

这是我第一个使用QCustomPlot控件的上位机,通过串口精确的5ms发送一次数据,再将读取的数据绘制到图表中。界面方面,尝试卡片式设计,外加QSS简单的配了个色。QCustomPlot官网:Qt...

大话西游2分享赢取种族坐骑手办!PK趣闻录由你书写

老友相聚,仗剑江湖!《大话西游2》2021全民PK季4月激燃打响,各PK玩法鏖战齐开,零门槛参与热情高涨。PK季期间,不仅各种玩法奖励丰厚,参与PK趣闻录活动,投稿自己在PK季遇到的趣事,还有机会带走...

测试谷歌VS Code AI 编程插件 Gemini Code Assist

用ClaudeSonnet3.7的天气测试编码,让谷歌VSCodeAI编程插件GeminiCodeAssist自动编程。生成的文件在浏览器中的效果如下:(附源代码)VSCode...

顾爷想知道第4.5期 国服便利性到底需优化啥?

前段时间DNF国服推出了名为“阿拉德B计划”的系列改版计划,截至目前我们已经看到了两项实装。不过关于便利性上,国服似乎还有很多路要走。自从顾爷回归DNF以来,几乎每天都在跟我抱怨关于DNF里面各种各样...

掌握Visual Studio项目配置【基础篇】

1.前言VisualStudio是Windows上最常用的C++集成开发环境之一,简称VS。VS功能十分强大,对应的,其配置系统较为复杂。不管是对于初学者还是有一定开发经验的开发者来说,捋清楚VS...

还嫌LED驱动设计套路深?那就来看看这篇文章吧

随着LED在各个领域的不同应用需求,LED驱动电路也在不断进步和发展。本文从LED的特性入手,推导出适合LED的电源驱动类型,再进一步介绍各类LED驱动设计。设计必读:LED四个关键特性特性一:非线...

Visual Studio Community 2022(VS2022)安装图文方法

直接上步骤:1,首先可以下载安装一个VisualStudio安装器,叫做VisualStudioinstaller。这个安装文件很小,很快就安装完成了。2,打开VisualStudioins...

Qt添加MSVC构建套件的方法(qt添加c++11)

前言有些时候,在Windows下因为某些需求需要使用MSVC编译器对程序进行编译,假设我们安装Qt的时候又只是安装了MingW构建套件,那么此时我们该如何给现有的Qt添加一个MSVC构建套件呢?本文以...

Qt为什么站稳c++GUI的top1(qt c)

为什么现在QT越来越成为c++界面编程的第一选择,从事QT编程多年,在这之前做C++界面都是基于MFC。当时为什么会从MFC转到QT?主要原因是MFC开发界面想做得好看一些十分困难,引用第三方基于MF...

qt开发IDE应该选择VS还是qt creator

如果一个公司选择了qt来开发自己的产品,在面临IDE的选择时会出现vs或者qtcreator,选择qt的IDE需要结合产品需求、部署平台、项目定位、程序猿本身和公司战略,因为大的软件产品需要明确IDE...

Qt 5.14.2超详细安装教程,不会来打我

Qt简介Qt(官方发音[kju:t],音同cute)是一个跨平台的C++开库,主要用来开发图形用户界面(GraphicalUserInterface,GUI)程序。Qt是纯C++开...

Cygwin配置与使用(四)——VI字体和颜色的配置

简介:VI的操作模式,基本上VI可以分为三种状态,分别是命令模式(commandmode)、插入模式(Insertmode)和底行模式(lastlinemode),各模式的功能区分如下:1)...

取消回复欢迎 发表评论: