[转帖]初探Linux CPU动态调频与实测
https://zhuanlan.zhihu.com/p/33753019
关于
本文主要涉及Linux CPUFreq子系统是什么,为什么需要,怎么用。
并解决在实际测试中遇到的三个问题:
scaling_governor
没有userspace
的问题。/proc/cpuinfo
与cpuinfo_cur_freq
显示频率不同。- 无法针对单个核心调频并使一个CPU下的不同的核心运行在不同的频率下。
参考资料
- Linux 2.6 内核中的最新电源管理技术综述_CPUFreq
- Linux动态频率调节系统CPUFreq
- Fedora社区对于问题一的讨论地址
- Archlinux论坛对于问题一的讨论地址
- StackExchange 问题:Why do cpuinfo_cur_freq and /proc/cpuinfo report different numbers?
- Stackoverflow 问题:Understanding cpu frequency, thread selection and more
- Intel 论坛问题:How can I scale only one core's frequency in a multi-core processor?
初探变频技术:在Linux中查看CPU相关信息
再问为什么之前,可以先看看到底Linux
变频到底是什么,可以通过什么手段来看。
本部分使用的操作系统是Fedora27
,linux
内核版本是4.13
。本部分参考参考资料2的博客。
在Linux系统中查看与CPU相关的信息主要有两个方法:
- 通过查看
/proc/cpuinfo
,比如当前运行频率可以通过|grep MHz
查看。但是这个方法在413,414内核变动较大,不推荐通过此方法查看。具体的原因可以见后面的小节。 - 另外一个方法是通过
sysfs
查看与修改,目录是/sys/devices/system/cpu/cpu*
先主要通过第二个方法进行查看:
与CPU相关的sysfs
接口均在此目录下,可以通过查看这些文件内容查看CPU相关的信息,例如:
- online offline 文件中保存着当前在线以及下线的核心的数量。
- present 中记录着主板上安装的CPU的编号
进一步进入cpufreq
目录下,该目录下的文件记录与频率相关的内容。
对于fedora系统,无需安装其它工具。如果使用ubuntu系统时,该目录可能为空,需要手动安装cpufrequtils
。
在cpuN
(N为具体的第几个CPU)下有关于该CPU的具体参数文件。与频率有关的文件在该目录下的cpufreq
文件夹下。fedora系统该文件夹下有如下信息:
cpuinfo_xxx
开头文件代表着cpu硬件上支持的频率cpuinfo_max_freq cpuinfo_min_freq
最大、最小频率cpuinfo_cur_freq
是当前运行的频率(可能也有问题,具体见后面的小节)scaling_xxx
开头文件代表可以通过CPUFreq系统用软件进行调节时所支持的频率scaling_available_governors
可供选择的频率调节策略scaling_governors
当前选择的策略scaling_max_freq scaling_min_freq
调节是最大、最小频率scaling_cur_freq
是软件当前指定的频率scaling_driver
调频驱动 (当前intel_pstate
)
特别注意:可能新版的处理器,新的Linux内核中只有部分接口,且调度也只有powersave和ondemand两种,这是由于使用了p-state driver
导致。如何修改见后面小节。
CPUFreq 子系统
根据以上观察,可以有如下总结:
- CPU的硬件特性决定了这个CPU的最高和最低工作频率,所有的频率调整数值都必须在这个范围内。
- 可以在这个范围内再次定义出一个软件的调节范围,它们用scaling_xxx_freq来表示
- CPUFreq系统把一些公共的逻辑和接口代码抽象出来,这些代码与平台无关,也与具体的调频策略无关
- 另外一部分,与实际的调频策略相关的部分被称作cpufreq_policy
- cpufreq_policy又是由频率信息和具体的governor组成,governor才是具体策略的实现者
- governor的实现最好能做到平台无关,与平台相关的代码用cpufreq_driver表述
关于CPUFreq的具体理论,主要参考参考文献1,该参考文献使用的linux内核位2.6版本,该部分以2.6版本为主。
为什么会出现变频技术
简要来说,变频技术的主要目的是节约功耗。变频技术作为电源管理技术以节能为目的加入linux内核。与之前看的大小核类似,变频技术都是为了 energy efficient computing
,为了提高performance per watt
。
变频与超频
变频与超频不同的是,超频是指通过提高核心电压等手段让处理器工作在非标准频率下的行为,这往往会造成 CPU 使用寿命缩短以及系统稳定性下降等严重后果。而变频技术是指CPU硬件本身支持在不同的频率下运行,系统在运行过程中可以根据随时可能发生变化的系统负载情况动态在这些不同的运行频率之间进行切换,从而达到对性能和功耗做到二者兼顾的目的。
为什么需要 CPUFreq子系统
由于每一个各家实现变频技术的使用方法都不同,故需要按照其实现方法向内核中添加代码,才能支持处理的变频使用。为了兼容各种类型的处理器并最大程度复用代码,故linux中开发了CPUFreq子系统用于实现变频的功能。
CPUFreq需要实现哪些部分
所以大思路是要兼容各种处理器,再根据工作负载动态调整处理器的运行的频率。所以可以将这个部分分为两个部分:
- 根据系统负载的动态变化挑选出 CPU 合适的运行频率。
- 按照选定的运行频率在选定的时间对 CPU 进行设置,使之真正工作在这一频率上。
从设计角度来说,应该保证二者是清晰的隔离开的并通过规范定义的接口进行通信
CPUFreq的设计
CPUFreq内核子系统的设计框架如下图所示:
故cpufreq
作为中间层,向上抽象了处理器变频的具体实现,向下分离了变频的策略。将具体的策略和变频的物理上实现进行分离。
这种设计带来的好处是使得 governor 和 CPU 相关的变频驱动程序的开发可以相互独立进行,并在最大限度上实现代码重用,内核开发人员在编写和试验新的 governor 时不会再陷入到某款特定 CPU 的变频技术的硬件实现细节中去,而 CPU 生产厂商在向 Linux 内核中添加支持其特定的 CPU 变频技术的代码时只需提供一个相对来说简单了很多的驱动程序,而不必考虑在各种不同的应用场景中如何选择合适的运行频率这些复杂的问题。
CPUFreq的使用
第一部分在实际机器上看的实际sysfs
中的文件就是CPUFreq
留的接口,可以通过cat
对文件进行读取,同时可以用echo
向文件写入。在2.6内核中,在选择使用userspace
的策略时,向scaling_setspeed
中写入指定的频率,可以修改CPU的运行频率。
除了可以使用sysfs
中提供的接口,还可以用上文提到的cpufrequtils
工具包。
用户如何根据实际负载变频
所以,当选择userspace
时,可以每固定时钟间隔根据任务负载对CPU频率进行调节。但是直接在用户态实现这些调节算法有以下两种问题:
- 当性能需求徒然提升时,需要等待下一次调节周期时才能更新实际运行频率,故有一段时间的慢速运行时间。
- 在用户空间对系统负载情况采样分析是否合理:
由于一个用户态程序很难完整的收集到所有需要的信息,因为这些信息大部分都保存在内核空间,如果想要收集这些系统信息,必然需要进行用户态与内核态之间的数据交互,而频繁的用户态与内核态之间的数据交互又会给系统性能带来负面影响。
所以在2.6内核中提出了ondemand
,其是一个在运行在内核态,细粒度时间间隔对系统负载情况采样分析的策略。那么这个表明系统负载的百分比数值是如何得到的呢?
在支持 Intel 最新的 Enhanced Speedstep 技术的 CPU 中,在处理器硬件中直接提供了两个 MSR 寄存器(Model Specific Register)供 ondemand governor 采样分析系统负载情况使用。这两个 MSR 寄存器的名字分别为 IA32_MPERF 和 IA32_APERF,
- IA32_MPERF MSR 中的 MPERF 代表 Maximum Performance ,该寄存器是一个当 CPU 处在 ACPI C0 状态下时按照 CPU 硬件支持的最高运行频率每隔一个时钟周期加一的计数器
- IA32_APERF MSR 中的 APERF 代表 Actual Performance ,该寄存器是一个当 CPU 处在 ACPI C0 状态下时按照 CPU 硬件当前的实际运行频率每隔一个时钟周期加一的计数器
有了这两个寄存器的存在,再考虑上 CPU 处于 ACPI C0 和处于 ACPI C1、C2、C3 三种状态下的时间比例,也就是 CPU 处于工作状态和休眠状态的时间比例, ondemand governor 就可以准确的计算出 CPU 的负载情况了
具体CPU驱动相关部分
实际上支持 Intel Enhanced Speedstep 技术的处理器为用户提供了非常简单的编程接口,对 CPU 运行频率进行设置是通过一个名为 IA32_PERF_CTL 的 MSR 寄存器进行的,另外还有一个名为 IA32_PERF_STATUS 的 MSR 寄存器可供检查 CPU 当前所处的运行频率。当用户需要对 CPU 运行频率进行设置时只需按照 Intel 开发手册的说明向 IA32_PERF_CTL MSR 寄存器中写入规定的数值即可。
所以,来调频吧
这一部分,本来想就是测试一下修改不同核心的频率,然后使其运行在不同的频率下。最后书写测试程序,使线程绑定具体的核心,跑下测试。然而没想到又遇到了很多问题。
- 首先,是
governor
没有userspace
的问题。 - 再,到底谁才真正显示了当前频率。
- 最后,CPU的核心真的能运行在不同频率下吗????
问题一:解决intel_pstate driver
解决思路
在两台Macbook Pro和Macbook Air上安装Fedora后并没有看到上面所说的ondemand
的调度方法,也没有发现可以通过用户态调整核心运行频率的接口,爬了各种帖子后发现其根本原因出在intel_pstate driver
上。(在/sys/devices/system/cpu/cpuX/cpufreq
下查看scaling_driver
显示为intel_pstate
。)
fedora社区讨论地址、archlinux论坛讨论地址,查看之后找到了archlinux里面的一个描述文档
- 对于现代 Intel CPU,将使用
pstate
功率驱动程序,而非下列其他驱动程序。此驱动程序的优先级高于其他驱动程序,并编入内核(而非编译为模块)。此驱动程序将自动用于 Sandy Bridge(以及更新的 CPU)。如果在使用这个驱动的时候遇到问题,建议您在 Grub 的内核参数中将其禁用(即修改 /etc/default/grub 文件,在 GRUB_CMDLINE_LINUX_DEFAULT= 后添加intel_pstate=disable
)。您可以使用与此驱动程序配套的用户空间工具,但这些工具不受您的控制。 - 尽管上述 P State 行为会受到
/sys/devices/system/cpu/intel_pstate
影响,例如:可以通过# echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo
关闭 Intel 睿频加速,从而降低 CPU 的温度。 - 对于现代 Intel CPU,Linux Thermal Daemon 也提供了一些其他的控制方法(例如 thermald),它们可以通过 P-state、T-state 或 Intel 节能驱动程序来主动控制系统温度。thermald 也适用于较老的 Intel CPU。如果最新版本的驱动程序不可用,那么守护进程会还原为 x86 MSR (Model Specific Register),由 Linux“cpufreq 子系统”来控制系统冷却。
Linux kernel中关于intel_pstate
的描述文档:链接 。Intel官方关于此驱动给的Slide:链接。
简单来说,pstat
又回去了,结合了变频策略和具体的硬件驱动,为了更好的性能和功耗……可能吧。有机会再详细学习一下pstat
。
在Fedora中将驱动改回acpi-cpufreq
- 按照官方说明,在/etc/default/grub 文件,在 GRUB_CMDLINE_LINUX_DEFAULT= 后添加
intel_pstate=disable
- 对于ubuntu系统,提供了update-grub的工具,而对于Fedora,需要利用grub2-mkconfig工具,输入以下命令:
sudo grub2-mkconfig -o /boot/grub2/grub.cfg #Traditional
sudo grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg #EFI
重新查看/sys/devices/system/cpu/cpuX/cpufreq/scaling_driver已经变为acpi-cpufreq。
本以为大功告成,可以愉快的测试了。结果又出现了更多的问题:
问题二:谁到底正真显示了CPU
的当前频率!!
问题现象
按照道理来说,第一部分介绍的两种方式查出来的当前频率应该相同。然而,事实并非如此:
/proc/cpuinfo 与 cpuinfo_cur_freq 居然不相符!!!!
发现问题时,我的内核已经更新到Linux4.14
了。当然发现与内核版本有关时,已是后话了。
/proc/cpuinfo
与cpuinfo_cur_freq
中反应的当前的CPU的频率有比较大的出入,下面是在设置调度策略为ondemand
时分别监视/proc/cpuinfo
中的频率信息与sysfs
的cpuinfo_cur_freq
中的频率信息。可以发现其中的差异非常大。
当设置调频策略为userspace
且设置四个核心为cpuinfo_cur_freq
中所示频率时,/proc/cpuinfo
中并没有相似的变动。
写了一个创建4个线程并平均分配到四个核心的相同计算任务的测试程序,并设置调频策略为ondemand
。可以看到在计算任务重时,虽然两个地方都显示跑到了最高频率,但是最高频率并不相同。
解决思路
爬了很多帖子,最后在Stack Exchange的这个问题 Why do cpuinfo_cur_freq and /proc/cpuinfo report different numbers? 下找到了线索。其中的一个老哥的回复非常有用,回复内容如下:
Note: Since Kernel 4.13, cat /proc/cpuinfo | grep MHz no longer returns the current clock speed. At the Kernel Bugzilla, they say it's intentional. See /proc/cpuinfo does not update frequency. It's also mentioned here: Power Management Updates Touch Intel P-State & More For Linux 4.13 – Marc Ranolfi Oct 11 '17 at 3:14
在第一个链接描述的现象正是现在我面临的情况:
The 4.13 kernel with intel_pstate=passive (or active) does not appear to correctly update the CPU frequency in /proc/cpuinfo
在该问题的讨论中,提及到4.13之后不再以/proc/cpuinfo
读取cpu
频率信息,且cpuinfo_cur_freq
才是正确的。这也导致一些依赖于/proc/cpuinfo
的软件出现一些问题。
在第二个链接里面提到了在Kernel 4.13
的更新中有这样一条新的特性:
x86 systems will no longer try to export their current CPU frequency to /proc/cpuinfo. There's also a way to rework how the CPU frequency is exported via sysfs too, using the registers for computing the current frequency rather than relying upon the CPUFreq driver
好吧,总的来说,就是和Linux内核版本相关,新的内核版本可能取消了向CPUinfo
输出实时频率的feature。
实际测试
而实际测试发现情况并没有这么简单。测试平台CPU信号为Intel haswell架构i5-4258U。
由于Fedora更新比较勤快,我的Fedora系统有三个内核:两个是4.14的,一个是4.13的。
下面测试均开了四个watch窗口,分别监视:/proc/cpuinfo
, cpuinfo_cur_freq
, scaling_cur_freq
, scaling_governor
。
4.14内核
首先测试在4.14内核中的情况:
当书写脚本将四个核心均调到性能模式(从按需模式调过来的),可以发现两个现象
- 目前来说没有问题,均到了最大频率。
- 但是和上面帖子不同的是,
/proc/cpuinfo
中展现的可能是正确的频率。
然后测试的是powersave
模式,如下图所示,有以下发现
- 依然没有问题,所有频率都降到了最低
- 同样,
/proc/cpuinfo
中展现的可能是正确的频率
然后跑自己设置的实验环境,两个900000,两个2401000。这次结果就比较有趣了
- 确实是用户设置的频率,但是只有设置的
cpu0
有用,其他的都按照cpu0
的频率跑 cpuinfo_cur_freq
倒是按照了设置来走的,可惜不是实际评论。
在测试一下设置不同的,可以断定所有的cpu
均按照cpu0
的频率来走了。
再设置回performance
时,发现其并没有全部升到最高,可能performance
策略不管用了……
总结一下414内核的特点:
/proc/cpuinfo
是显示正确频率的地方cpuinfo_cur_freq
显示的是错误的,虽然是最接近设置目标的。userspace
只能设置统一频率performance
不管用
4.13内核
切换回4.13
内核进行测试,配置测试环境依旧如上相同。这里不单一分析了,直接在最后进行总结。
用户配置模式,这里配置的是2300000, 2300000,1800000,1500000
。依旧只按照cpu0
进行设置。
powersaving
模式:
performance
模式:
特意为了检测governor
是否也只能统一设置,做了如下实验,得出结论,governor
也是统一设置的。
所以4.13
内核的总结如下:
/proc/cpuinfo
总是显示最高频率,cpuinfo_cur_freq
中显示的亦不是正确频率scaling_cur_freq
中显示的是当前频率。userspace
可以统一设置频率,不能单独设置。performance
没有用。
总结
- 412 413 414 内核关于CPU变频这块变动明显
- 无论是413还是414内核,均以
scaling_cur_freq
为准。 - 貌似核心频率只能全部修改,不能当个修改。
问题三:到底能不能单独配置每个核心运行频率?
上面的测试可以发现,核心频率可以全部修改,不能单独修改?所以到底能不能单独配置每个核心的运行频率呢?
第一条线索
为了找这个问题的答案,爬了很多帖子,在stackoverflow的这个问题下找到了线索:Understanding cpu frequency, thread selection and more,取答案中比较关键的部分翻译如下:
大体来说,cpufreq
提供的很多功能并不被Hardware或者Kernel所支持,所以通过cpufreq
设置的功能不一定会按照预期运行。例如,如果利用cpufreq
为每个cpu
设置单独的运行的频率,现实中在超线程的系统,两个CPUs
可能会绑定在一起,所以必须有相同的频率。
Intel P-states
实际上是提供了一个frequency-voltage
对,通过降低cpu
运行的电压来降低cpu
的运行频率。这些frequency-voltage
对是离散的,可能与cpufreq
提供的可选频率有出入。
所以从这个答案可以知道第一个原因:
- 可能由于超线程技术导致两个虚拟CPU其实是一个核心,所以两个绑定在一起。
第二条线索
转到Intel的论坛,发现类似的一个帖子:How can I scale only one core's frequency in a multi-core processor? 在这个问题中,McCalpin, John给出了另一个比较详细的解释,原答案可以找原贴看。
首先要了解什么是uncore
,其实uncore
就是intel用来描述其微处理器上不是un
处理器核心core
的部分,包括例如L1 L2 cache
,ALU
之类一堆。处理器运行的频率/电压与uncore
有关。
回答的主要内容总结如下
- 首先第一个问题是当前消费级别的
uncore
(如i系),只支持设置唯一一个时钟频率。 - 然后是服务器级的
uncore
(如E系),虽然支持每个核心不同频率,但是你一旦指定他们运行在不同的频率,uncore中功耗控制单元(PCU)可能会再次改写你的请求,因为PCU可能认为你的设定不合理…… - 所以讨论一下运行在不同的频率的可能性:
- 能否直接要求每个核心运行在不同频率:设置是可以的,通过修改
MSR IA32_PERF_CTL
寄存器,但是这并不意味着硬件会响应你的请求。 - 能否通过设置不同核的电压,间接改变核心的运行频率:
- 首先很少系统是有与核数量相同的电源来提供运行在不同电压上。
- 再则,在Haswell架构之前,频率和电压是绑定的,一起写入
MSR IA32_PERF_CTL
。 Haswell
提供了 on-chip voltage regulators ,其允许给不同的核心不同的频率。- 这也不意味着硬件会响应你的请求(因为PCU的存在)
- 所以到底他们有可能会响应吗
- 首先要清楚,PCU有最终的决定权
- 该答案的作者也没能在Haswell之前的处理器中实现运行不同频率。
- 这个部分详细可以去看 Uncore Performance Monitoring Manuals for the various Xeon E5 products
So… Conclusion
所以在我的当前的笔记本环境下跑出不同频率的CPU可能性不大了。本来想着p-state
和具体uncore
对于变频的处理细节可以暂时不管,可能现在需要继续填坑,详细了解了。
[转帖]初探Linux CPU动态调频与实测的更多相关文章
- linux CPU动态调频【转】
转自:https://www.xuebuyuan.com/2185926.html 针对sep4020的linux低功耗研究也有一段时间了,基本把低功耗的实现方式想清楚了(主要分成机制和策略),这段时 ...
- 初探Linux内核中的内存管理
Linux内核设计与实现之内存管理的读书笔记 初探Linux内核管理 内核本身不像用户空间那样奢侈的使用内存; 内核不支持简单快捷的内存分配机制, 用户空间支持? 这种简单快捷的内存分配机制是什么呢? ...
- 程序的链接和装入及Linux下动态链接的实现
http://www.ibm.com/developerworks/cn/linux/l-dynlink/ 程序的链接和装入及Linux下动态链接的实现 程序的链接和装入存在着多种方法,而如今最为流行 ...
- 查看线程linux cpu使用率
Linux下如何查看高CPU占用率线程 LINUX CPU利用率计算 转 http://www.cnblogs.com/lidabo/p/4738113.html目录(?)[-] proc文件系统 p ...
- iTOP-iMX6UL开发板【全能版】-动态调频技术简介
本文档以 iMX6UL 为例,简单介绍 cpufreq 的 5 种模式. 在 imx6ul 的 menuconfig 中,进入 CPU Power Management ---> CPU Fre ...
- 支持动态调频_配置AXP228电源管理_4核8核兼容设计_iTOP-4418/6818开发板
iTOP-4418/6818开发板 支持动态调频,AXP228电源管理, 系统支持:Android4.4/5.1.1.Linux3.4.39.QT2.2/4.7/5.7.Ubuntu12.04 内存: ...
- iTOP-6818开发板支持AXP228电源管理[官方推荐最佳匹配]_支持动态调频
iTOP-6818开发板与4418开发板共兼容同一底板: 核心板:::::: 尺寸 50mm*60mm 高度 核心板连接器组合高度1.5mm PCB层数 6层PCB沉金设计 4418 CPU ARM ...
- [Fw]初探linux中断系统(2)
初探linux中断系统(2) 中断系统初始化的过程 用来初始化中断系统的函数位于arch/x86/kernel/irqinit.c,定义如下 void __init init_IRQ(void){ i ...
- iTOP-iMX6UL开发板-动态调频技术文档分享
本文档以 iMX6UL 为例,简单介绍 cpufreq 的 5 种模式. 在 imx6ul 的 menuconfig 中,进入 CPU Power Management ---> CPU Fre ...
- 谈谈Linux下动态库查找路径的问题 ldconfig LD_LIBRARY_PATH PKG_CONFIG_PATH
谈谈Linux下动态库查找路径的问题 ldconfig LD_LIBRARY_PATH PKG_CONFIG_PATH 转载自:http://blog.chinaunix.net/xmlrpc.ph ...
随机推荐
- 数仓调优实践丨SQL改写消除相关子查询
本文分享自华为云社区<[调优实践]SQL改写消除相关子查询>,作者: 门前一棵葡萄树 . 一.子查询 GaussDB(DWS)根据子查询在SQL语句中的位置把子查询分成了子查询.子链接两种 ...
- 云图说丨云数据库GaussDB(for MySQL)事务拆分大揭秘
摘要:数据库代理提供事务拆分的功能,能够将事务内写操作之前的读请求转发到只读节点,降低主节点负载. 本文分享自华为云社区<[云图说]第270期 云数据库GaussDB(for MySQL)事务拆 ...
- 统一元数据,数据湖Catalog让大数据存算分离不再是问题
摘要:为了解决现阶段大数据存算分离痛点问题,华为云大数据推出重量级数据湖Catalog服务. 1 背景 随着5G.IoT等技术的发展,企业积累了越来越多的数据,需要激发更多的数据价值变现.传统大数据平 ...
- openGauss内核分析:SQL by pass & 经典执行器
摘要:执行引擎一般负责查询的执行,执行引擎在SQL执行栈中起到接收优化器生成的执行计划Plan.并对通过存储引擎提供的数据读写接口,实现对数据进行计算得到查询的结果集. 本文分享自华为云社区<o ...
- AI专家一席谈:复用算法、模型、案例,AI Gallery带你快速上手应用开发
摘要: 华为云社区邀请到了AI Gallery的负责人严博,听他谈一谈AI Gallery的设计初衷.经典案例以及未来规划. 本文分享自华为云社区<AI专家一席谈:复用算法.模型.案例,AI G ...
- AI新手语音入门:认识词错率WER与字错率CER
摘要:本文介绍了词错率WER和字错率CER的概念,引入了编辑距离的概念与计算方法,从而推导得到词错率或字错率的计算方法. 本文分享自华为云社区<新手语音入门(一):认识词错率WER与字错率CER ...
- Android 启动优化(二) - 有向无环图的原理以及解题思路
Android 启动优化(一) - 有向无环图 Android 启动优化(二) - 拓扑排序的原理以及解题思路 Android 启动优化(三) - AnchorTask 使用说明 Android 启动 ...
- vue-router路由复用后页面没有刷新
vue-router提供了页面路由功能,可以用来构建单页面应用,在使用vue-router的动态路由匹配的时候,遇到了url变化了,但是页面却没有任何动静的问题,记录一下. 动态路由匹配url变化了, ...
- Go语言安装(Windows10)
一. 官网下载 https://golang.google.cn/dl/ 二. 软件包安装 选择对应的路径进行安装 三. 环境变量设置 1.path 检查系统环境变量Path内已经添加Go的安 ...
- json 解析:marshal 和 unmarshal
Go 使用 encoding/json 包的 marshal 和 unmarshal 实现 json 数据的编解码.分别记录如下: 1. marshal 定义结构体: type OCP struct ...