cgroup-v1在android中的应用实现浅析

本文档内容主要是分析android设备中cgroup v1实现了哪些控制器,他们有哪些子控制器以及如何配置这些控制器的。

我是使用红米Note4Plus的开发版本来调研分析的,手机已经解锁并具有了root权限,可以随意操作修改手机内容。不涉及到源代码层面的调查分析。

设备的基本配置信息:高通msm8953芯片、android7.0、8核CPU-arm64、3GB内存、内核版本3.18.31。

adb shell uname -a
Linux localhost 3.18.31-perf-g66052ad #1 SMP PREEMPT Thu Aug 29 23:06:40 CST 2019 aarch64
adb shell getprop |grep -iE "ro.build|ro.product|ro.board"
[ro.board.platform]: [msm8953]
[ro.build.date]: [Thu Aug 29 22:56:57 CST 2019]
[ro.build.software.version]: [Android7.0_10]
[ro.build.version.sdk]: [24]
[ro.product.board]: [msm8953]
[ro.product.cpu.abi]: [arm64-v8a]
[ro.product.model]: [Redmi Note 4X]

8核CPU, AArch64:

adb shell cat /proc/cpuinfo
Processor   : AArch64 Processor rev 4 (aarch64)
processor   : 0
BogoMIPS    : 38.40
Features    : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part    : 0xd03
CPU revision    : 4

processor   : 1  ...

processor   : 2  ...

processor   : 3  ...

processor   : 4  ...

processor   : 5  ...

processor   : 6  ...

processor   : 7  ...

Hardware    : Qualcomm Technologies, Inc MSM8953

内存总大小为3GB。

adb shell cat /proc/meminfo
MemTotal:        2914764 kB  ## 内存大小为3GB
MemFree:         1100080 kB
MemAvailable:    1306628 kB
Buffers:            9584 kB
Cached:           399040 kB
SwapCached:        72728 kB
Active:           598636 kB
Inactive:         411028 kB
Active(anon):     365696 kB
Inactive(anon):   391956 kB
Active(file):     232940 kB
Inactive(file):    19072 kB
Unevictable:      146796 kB
Mlocked:          146796 kB
SwapTotal:       1048572 kB
SwapFree:         669908 kB
Dirty:                60 kB
Writeback:             0 kB
AnonPages:        741228 kB
Mapped:           384520 kB
Shmem:             10056 kB
Slab:             133476 kB
SReclaimable:      36096 kB
SUnreclaim:        97380 kB
KernelStack:       38976 kB
PageTables:        38472 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     2505952 kB
Committed_AS:   70269080 kB
VmallocTotal:   258998208 kB
VmallocUsed:      126804 kB
VmallocChunk:   258746676 kB

开机初始化部分,主要分析cgroup文件系统是如何初始化的。我们重点关注init.xxx.rc文件中的初始化配置。

1.1 init.miui.rc

创建和挂载memory、freezer控制组。
on init
    # Create cgroup mount point for memory and freezer
    mount tmpfs none /sys/fs/cgroup mode=0750,uid=0,gid=1000
    mkdir /sys/fs/cgroup/memory 0750 root system
    mount cgroup none /sys/fs/cgroup/memory memory
    mkdir /sys/fs/cgroup/freezer 0750 root system
    mount cgroup none /sys/fs/cgroup/freezer freezer

创建cpuset的子控制器:vr、foreground、top-app、boost等
设置默认权限
on late-init
    # set vr related cpuset
    mkdir /dev/cpuset/vr
    write /dev/cpuset/vr/mems 0

    # change permissions for vr cpusets as we'll touch at runtime
    chown system system /dev/cpuset/foreground/boost/cpus
    chmod 0664 /dev/cpuset/foreground/cpus
    chown root system /dev/cpuset/foreground/cpus
    chown system system /dev/cpuset/vr
    chown system system /dev/cpuset/vr/cpu_exclusive
    chown system system /dev/cpuset/vr/cpus
    chown system system /dev/cpuset/vr/tasks
    chmod 0664 /dev/cpuset/top-app/cpus
    chown root system /dev/cpuset/top-app/cpus
    chown system system /dev/cpuset/top-app/boost
    chown system system /dev/cpuset/top-app/boost/tasks
    chown system system /dev/cpuset/top-app/boost/cpus
    chmod 0664 /dev/cpuset/vr/cpu_exclusive
    chmod 0664 /dev/cpuset/vr/cpus
    chmod 0664 /dev/cpuset/vr/tasks
    chmod 0664 /dev/cpuset/top-app/boost/tasks

创建cpuset子控制器game、gamelite,并设置权限。
on late-init
    # put some heavy-load thread into this cpuset for performance
    mkdir /dev/cpuset/game
    write /dev/cpuset/game/mems 0
    chown system system /dev/cpuset/game
    chown system system /dev/cpuset/game/tasks
    chown system system /dev/cpuset/game/cgroup.procs
    chmod 0660 /dev/cpuset/game/tasks
    chmod 0660 /dev/cpuset/game/cgroup.procs
    # put some light-load thread into this cpuset for battery life
    mkdir /dev/cpuset/gamelite
    write /dev/cpuset/gamelite/mems 0
    chown system system /dev/cpuset/gamelite
    chown system system /dev/cpuset/gamelite/tasks
    chown system system /dev/cpuset/gamelite/cgroup.procs
    chmod 0660 /dev/cpuset/gamelite/tasks
    chmod 0660 /dev/cpuset/gamelite/cgroup.procs

on boot
    # 压力时速监视器
    # psi
    chmod 0660 /proc/pressure/io
    chmod 0660 /proc/pressure/memory
    chmod 0660 /proc/pressure/cpu

    # 创建cpuctl下的子控制器fg_service、fg_limited
    # 初始化子控制器配置
    mkdir /dev/cpuctl/fg_service
    chown system system /dev/cpuctl/fg_service/tasks
    chmod 0666 /dev/cpuctl/fg_service/tasks
    write /dev/cpuctl/bg_non_interactive/cpu.rt_runtime_us 300000
    write /dev/cpuctl/fg_service/cpu.shares 256
    write /dev/cpuctl/fg_service/cpu.rt_runtime_us 400000
    write /dev/cpuctl/fg_service/cpu.rt_period_us 1000000

    mkdir /dev/cpuctl/fg_service/fg_limited
    chown system system /dev/cpuctl/fg_service/fg_limited/tasks
    chmod 0666 /dev/cpuctl/fg_service/fg_limited/tasks
    write /dev/cpuctl/fg_service/fg_limited/cpu.shares 256
    write /dev/cpuctl/fg_service/fg_limited/cpu.rt_runtime_us 400000
    write /dev/cpuctl/fg_service/fg_limited/cpu.rt_period_us 1000000

1.2 init.qcom.rc

on init
    # 创建内存控制器
    # 设置基本配置
    # Create cgroup mount point for memory
    mkdir /sys/fs/cgroup/memory/bg 0750 root system
    write /sys/fs/cgroup/memory/bg/memory.swappiness 140
    write /sys/fs/cgroup/memory/bg/memory.move_charge_at_immigrate 1
    chown root system /sys/fs/cgroup/memory/bg/tasks
    chmod 0660 /sys/fs/cgroup/memory/bg/tasks

把日志服务进程ID写入到cpuset/system-background/tasks
Logcat dump daemon, dumps logs to logdump partition
service logdumpd /system/bin/logcat -b all -v threadtime -D -w /dev/block/bootdevice/by-name/logdump
    class core
    writepid /dev/cpuset/system-background/tasks
    seclabel u:r:logdumpd:s0
    disabled

1.3 init.miui.early_boot.sh

配置了dex2oat线程的cpuset。详情忽略。

1.4 init.zygote64_32.rc

把zygote服务放入cpuset/foreground控制组
service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server --socket-name=zygote
    class main
    socket zygote stream 660 root system
    onrestart write /sys/android_power/request_state wake
    onrestart write /sys/power/state on
    onrestart restart audioserver
    onrestart restart cameraserver
    onrestart restart media
    onrestart restart netd
    writepid /dev/cpuset/foreground/tasks /sys/fs/cgroup/stune/foreground/tasks
    writepid /d/ktrace/sched/zygote64_pid

service zygote_secondary /system/bin/app_process32 -Xzygote /system/bin --zygote --socket-name=zygote_secondary
    class main
    socket zygote_secondary stream 660 root system
    onrestart restart zygote
    writepid /dev/cpuset/foreground/tasks /dev/stune/foreground/tasks
    writepid /d/ktrace/sched/zygote_pid

1.5 init.target.rc

在这个文件中设置各种子控制组的默认的CPU亲和性。

配置了cpuset的各组cpu分配
on boot
    write /dev/cpuset/top-app/cpus 0-7
    # 顶层app中的boost任务限制在4-7
    write /dev/cpuset/top-app/boost/cpus 4-7
    # 前台任务限制在0-6
    write /dev/cpuset/foreground/cpus 0-6
    write /dev/cpuset/foreground/boost/cpus 0-6
    # 后台任务限制到 0-1
    write /dev/cpuset/background/cpus 0-1
    # 系统后台限制到 0-3
    write /dev/cpuset/system-background/cpus 0-3

总而言之,在开机初始化init.xx.rc中完成的任务主要是:

  • 创建和挂载控制组文件系统。
  • 写入初始的基础配置信息。
  • 写入某些关键进程到默认的控制组。

2.1 控制器信息

cat /proc/cgroups
#subsys_name     hierarchy  num_cgroups enabled
cpuset           4  10  1
cpu          3  3   1
cpuacct          1  108 1
memory           2  3   1
freezer          5  65  1

这里会列举出每个控制器的名称、分层的层级数、子控制组数量、是否已经使能。

2.2 控制组文件系统

查看每种控制组文件系统的挂载位置和挂载类型。

mount |grep cgroup
none on /acct type cgroup (rw,relatime,cpuacct)
none on /dev/memcg type cgroup (rw,relatime,memory)
none on /dev/cpuctl type cgroup (rw,relatime,cpu)
none on /dev/cpuset type cgroup (rw,relatime,cpuset,noprefix,release_agent=/sbin/cpuset_release_agent)
none on /sys/fs/cgroup type tmpfs (rw,seclabel,relatime,size=1436904k,nr_inodes=359226,mode=750,gid=1000)
none on /sys/fs/cgroup/memory type cgroup (rw,relatime,memory)
none on /sys/fs/cgroup/freezer type cgroup (rw,relatime,freezer)

说明:
挂载的文件系统类型是cgroup,是cgroup v1版本。cgroup v2版本的文件系统类型是cgroup2。
发现有两个memory的节点:/dev/memcg,/sys/fs/cgroup/memory。查看对比了文件内容完全一致。没有代码来验证他们是否是一个链接关系。

接下来我们就依次查看一下每种控制器的分层结构和配置信息。

从#2.1章节我们可以看到cpuacct有1个分层,108个控制组。这些子控制器是默认划分的,以用户id为单位。

ls -l
-rw-r--r--  1 root   root   0 2022-06-16 14:20 cgroup.clone_children
-rw-r--r--  1 root   root   0 2022-06-16 14:20 cgroup.procs
-r--r--r--  1 root   root   0 2022-06-16 14:20 cgroup.sane_behavior
-r--r--r--  1 root   root   0 2022-06-16 14:20 cpuacct.stat
-rw-r--r--  1 root   root   0 2022-06-16 14:20 cpuacct.usage
-r--r--r--  1 root   root   0 2022-06-16 14:20 cpuacct.usage_percpu
-rw-r--r--  1 root   root   0 2022-06-16 14:20 notify_on_release
-rw-r--r--  1 root   root   0 2022-06-16 14:20 release_agent
-rw-r--r--  1 root   root   0 2022-06-16 14:20 tasks
drwxr-xr-x  2 root   root   0 2022-06-16 14:20 uid
drwx------ 20 system system 0 2022-06-16 13:57 uid_1000
drwx------  5 system system 0 2022-06-16 10:28 uid_1001
drwx------  6 system system 0 2022-06-16 10:27 uid_......

drwx------  2 system system 0 2022-06-16 10:27 uid_10125
drwx------  2 system system 0 2022-06-16 10:27 uid_10127
drwx------  2 system system 0 2022-06-16 10:27 uid_10137

cat命令查看根目录下的配置后做个简单汇总:

配置 值 说明 cgroup.clone_children 0 子控制组不克隆配置 cgroup.procs … 进程id列表 cgroup.sane_behavior 0 不启用blkio统计 cpuacct.stat user 46994,system 72578 用户空间和内核空间消耗的USER_HZ cpuacct.usage 1317380348219 所有任务的累加CPU时间 cpuacct.usage_percpu 。。。 每个CPU的累加时间(共8个CPU) notify_on_release 0 没有启用控制组释放的通知 release_agent – 没有指定命令 tasks … 线程id列表

任意选择一个子控制器uid_10110来看一下:

ls
cgroup.clone_children cpuacct.stat  cpuacct.usage_percpu tasks
cgroup.procs          cpuacct.usage notify_on_release

cat cpuacct.usage
564932354
cat cpuacct.usage_percpu
165586827 221125369 52289165 26123542 18939792 24406827 49224999 7235833
cat cpuacct.stat
user 50
system 16

4.1 cpuset分层结构

从#2.1章节我们可以看到cpuset有4个分层,10个控制组。

通过直观的查看目录树,我们看到CPUSET控制组的树形目录:

/dev/cpuset
├── top-app
│   └── boost
├── foreground
│   └── boost
├── foreground
├── background
├── system-background
├── game
├── gamelite
└── vr

4.2 cpuset根控制组

看一下根目录结构:

adb shell ls -l /dev/cpuset
total 0
drwxr-xr-x 2 system system 0 1974-11-23 05:28 background
-rw-r--r-- 1 root   root   0 2022-06-17 08:58 cgroup.clone_children
-rw-r--r-- 1 root   root   0 2022-06-17 08:58 cgroup.procs
-r--r--r-- 1 root   root   0 2022-06-17 08:58 cgroup.sane_behavior
-rw-r--r-- 1 root   root   0 2022-06-17 08:58 cpu_exclusive
-rw-r--r-- 1 root   root   0 2022-06-17 08:58 cpus
-r--r--r-- 1 root   root   0 2022-06-17 08:58 effective_cpus
-r--r--r-- 1 root   root   0 2022-06-17 08:58 effective_mems
drwxr-xr-x 3 system system 0 1974-11-23 05:28 foreground
drwxr-xr-x 2 system system 0 1974-11-23 05:28 game
drwxr-xr-x 2 system system 0 1974-11-23 05:28 gamelite
-rw-r--r-- 1 root   root   0 2022-06-17 08:58 mem_exclusive
-rw-r--r-- 1 root   root   0 2022-06-17 08:58 mem_hardwall
-rw-r--r-- 1 root   root   0 2022-06-17 08:58 memory_migrate
-r--r--r-- 1 root   root   0 2022-06-17 08:58 memory_pressure
-rw-r--r-- 1 root   root   0 2022-06-17 08:58 memory_pressure_enabled
-rw-r--r-- 1 root   root   0 2022-06-17 08:58 memory_spread_page
-rw-r--r-- 1 root   root   0 2022-06-17 08:58 memory_spread_slab
-rw-r--r-- 1 root   root   0 2022-06-17 08:58 mems
-rw-r--r-- 1 root   root   0 2022-06-17 08:58 notify_on_release
-rw-r--r-- 1 root   root   0 2022-06-17 08:58 release_agent
-rw-r--r-- 1 root   root   0 2022-06-17 08:58 sched_load_balance
-rw-r--r-- 1 root   root   0 2022-06-17 08:58 sched_relax_domain_level
drwxrwxr-x 2 system system 0 1974-11-23 05:28 system-background
-rw-rw-r-- 1 system system 0 1974-11-23 05:28 tasks
drwxr-xr-x 3 system system 0 1974-11-23 05:28 top-app
drwxr-xr-x 2 system system 0 1974-11-23 05:28 vr

cat命令查看根目录下的配置后做个简单汇总:

配置 值 说明 cgroup.clone_children 0 子控制组不克隆配置 cgroup.procs … 进程id列表 cgroup.sane_behavior 0 不启用blkio统计 cpus 0-7 cpu id列表 mems 0 mem节点id列表 effective_cpus 0-7 有效cpu id列表 effective_mems 0 有效mem节点id列表 cpu_exclusive 1 cpu独占 mem_exclusive 1 mem独占 mem_hardwall 0 页面限制没有启用 memory_migrate 0 内存移动没有启用 memory_pressure_enabled 0 内存压力监测没有使能 memory_pressure 0 内存压力监测为空 memory_spread_page 0 page扩展没有使能 memory_spread_slab 0 slab扩展没有使能 sched_load_balance 1 开启负载均衡 sched_relax_domain_level -1 调度搜索范围设为不限制 notify_on_release 0 没有启用控制组释放的通知 release_agent /sbin/cpuset_release_agent 指定了命令 tasks … 线程id列表

4.3 cpuset子控制组

关键是要看系统的子控制组如何配置的。这些控制组的默认设置在初始化init.xxx.rc时已经写入了。我这里汇总一下cpuset中cpu和mem相关的配置信息。

控制组 cpus mems sched_load_balance top-app 0-7 0 1 top-app/boost 4-7 0 1 foreground 0-6 0 1 foreground/boost 4-7 0 1 background 0-1 0 1 system-background 0-3 0 1 game – 0 1 gamelite – 0 1 vr – 0 1

对看到的结果做个汇总:

  • 只有一个mem节点,所以内存节点id列表肯定是0。
  • miui配置的三个子控制组cpus为空,会使用父目录下的配置。
  • boost性能要求的控制组都配置在CPU4-7
  • 后台限制在0-1
  • 系统后台限制在0-3
  • top应用全开放cpu0-7

5.1 cpuctl分层结构

从#2.1章节我们可以看到cpuctl有3个分层和3个控制组。

通过查看/dev/cpuctl下的目录结构,我们可以看到控制组的分层结构:

/dev/cpuctl
└── fg_service
    └──  fg_limited

5.2 cpuctl配置和属性

控制组根目录:

adb shell ls -l /dev/cpuctl
-rw-r--r-- 1 root   root   0 2022-06-17 10:42 cgroup.clone_children
-rw-r--r-- 1 root   root   0 2022-06-17 10:42 cgroup.procs
-r--r--r-- 1 root   root   0 2022-06-17 10:42 cgroup.sane_behavior
-rw-r--r-- 1 root   root   0 2022-06-17 10:42 cpu.cfs_period_us
-rw-r--r-- 1 root   root   0 2022-06-17 10:42 cpu.cfs_quota_us
-rw-r--r-- 1 root   root   0 2022-06-17 10:42 cpu.notify_on_migrate
-rw-r--r-- 1 root   root   0 2022-06-17 10:42 cpu.rt_period_us
-rw-r--r-- 1 root   root   0 2022-06-17 10:42 cpu.rt_runtime_us
-rw-r--r-- 1 root   root   0 2022-06-17 10:42 cpu.shares
-r--r--r-- 1 root   root   0 2022-06-17 10:42 cpu.stat
-rw-r--r-- 1 root   root   0 2022-06-17 10:42 cpu.upmigrate_discourage
drwxr-xr-x 3 root   root   0 1974-11-23 05:28 fg_service
-rw-r--r-- 1 root   root   0 2022-06-17 10:42 notify_on_release
-rw-r--r-- 1 root   root   0 2022-06-17 10:42 release_agent
-rw-rw-rw- 1 system system 0 1974-11-23 05:28 tasks

通过cat命令,我们可以查看到几个关键的cpu时间片分配信息:

配置 root fg_service fg_limited 说明 cfs_period_us 100000 100000 100000 100ms调度周期 cfs_quota_us -1 -1 80000 fg_limited的时间片限定为80ms,即80%比例 shares 1024 256 256 fg_service和fg_limited的时间调度比分别设为1/4 rt_period_us 1000000 1000000 1000000 CPU运行周期1秒 rt_runtime_us 950000 400000 400000 允许运行的CPU时间为950ms、400ms、400ms

6.1 mem控制组分层结构

查看控制组信息:

adb shell cat /proc/cgroups
#subsys_name    hierarchy   num_cgroups enabled
cpuset  4   10  1
cpu 3   3   1
cpuacct 1   103 1
memory  2   3   1
freezer 5   65  1

控制组有2层,3个控制组。通过查看/sys/fs/cgroup/memory目录,我们可以看到memory的控制组结构如下:

/sys/fs/cgroup/memory
├── apps
└── sys_critical

6.2 控制组配置

通过cat命令,我们可以查看个控制组下的配置信息。在此我们跟控制组和2个子控制组的配置收集在这个表格中:

配置 root apps sys_critical 说明 cgroup.clone_children 0 0 cgroup.event_control – – – cgroup.procs 列表省略… 空 … cgroup.sane_behavior 0 无此文件 notify_on_release 0 0 release_agent 空 无此文件 tasks 列表省略… 空 … memory.failcnt 0 0 0 memory.force_empty – – – memory.limit_in_bytes 18446744073709551615 18446744073709551615 18446744073709551615 memory.max_usage_in_bytes 0 0 2793472 memory.memsw.failcnt 0 0 0 memory.memsw.limit_in_bytes 18446744073709551615 18446744073709551615 18446744073709551615 memory.memsw.max_usage_in_bytes 0 0 2797568 memory.memsw.usage_in_bytes 2329587712 0 2666496 memory.move_charge_at_immigrate 0 0 0 memory.oom_control oom_kill_disable 0 under_oom 0 oom_kill_disable 0 under_oom 0 oom_kill_disable 0 under_oom 0 memory.pressure_level – – – memory.soft_limit_in_bytes 18446744073709551615 18446744073709551615 18446744073709551615 memory.stat 内容太长,省略 内容太长,省略 内容太长,省略 memory.swappiness 60 0 0 memory.usage_in_bytes 1964482560 0 2662400 memory.use_hierarchy 0 0 0 0

针对上表信息对内存配置作个总结说明:

  • apps控制组没有写入任务进程和线程,实际上没有启用。
  • 内容用量还没有触达上限阈值,没有相关的内存不够用情况
  • 内存软限制跟硬限制阈值大小一样。

7.1 freezer分层结构

查看控制组信息:

adb shell cat /proc/cgroups
#subsys_name    hierarchy   num_cgroups enabled
cpuset  4   10  1
cpu 3   3   1
cpuacct 1   103 1
memory  2   3   1
freezer 5   65  1

freezer控制组有5个层次,65个控制组。

我们看一下/sys/fs/cgroup/freezer的目录结构,大概看一下控制的分层结构(一个root加上64个子控制组):

/sys/fs/cgroup/freezer
├── miui0
├── miui1
├── miui2
├── miuiXXX ...

├── miui61
├── miui62
└── miui63

从这里可以看出,miui默认划分了64个子控制组,如果需要批量操作进程线程,只需要写入到相应的控制组即可。

7.2 freezer控制组配置

根目录下除了cgroup全局控制之外,没有其他内容。
muiui0~miui63子控制组只是预先划分好的,里面并没有填充任何进程和线程,实际上是没有有效工作的。

我们随便看一下miui11子控制组下的配置文件:

cat cgroup.clone_children
0
没有配置进程列表
cat cgroup.procs
空
父状态
cat freezer.parent_freezing
0
自状态
cat freezer.self_freezing
0
状态:未冻结
cat freezer.state
THAWED

释放通知未启用
cat notify_on_release
0

线程列表为空
cat tasks
空

Original: https://www.cnblogs.com/aosp/p/16399443.html
Author: 河东西望
Title: cgroup-v1在android中的应用实现浅析

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/582224/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • centos7启动docker容器时提示Error response from daemon: Unknown runtime specified docker-runc

    记录centos7启动docker 过程 csharp;gutter:true; systemctl start docker 启动docker 程序docker start xx…

    Linux 2023年6月8日
    087
  • Shell脚本生成密码

    利用 /dev/urando 生成密码 密码以字母、数字、开头 特殊符号多 for _ in {1..30};do tr -dc ‘~`!@#$%^&*()_+-={}:&…

    Linux 2023年6月6日
    094
  • MIT6.828——Lab3 PartA(麻省理工操作系统实验)

    Lab3 Part A MIT6.828——Lab1 PartA MIT6.828——Lab1 PartB Lab2内存管理准备知识 MIT6.828——Lab2 内核维护有关用户…

    Linux 2023年5月27日
    096
  • 一劳永逸,解决.NET发布云服务器的时区问题

    国内大多数开发者使用的电脑,都是使用的北京时间,日常开发的过程中其实并没有什么不便;不过,等遇到了阿里云等云服务器,系统默认使用的时间大多为 UTC时间,这个时候,时区和时间的问题…

    Linux 2023年6月6日
    082
  • 基本数据类型的长度

    32位机器和64位机器中int、char等数据类型所占字节长度对比。 在32位机器和64机器中int类型都占用4个字节。编译器可以根据自身硬件来选择合适的大小,但是需要满足约束:s…

    Linux 2023年6月13日
    084
  • 【EventOS Nano】EventOS Nano使用快速入门

    快速入门 EventOS Nano非常简单,除源码外,只需要实现三个代码,就可以使用EventOS Nano编写程序 main.c main函数,初始化和启动EventOS eos…

    Linux 2023年6月13日
    081
  • [随记]-linux侦听端口的4种方法

    侦听 192.168.0.1 服务器上的 10086 端口是否打开 1. telnet telnet是windows 内置的功能,当然 linux 也有。用法: tenlet 19…

    Linux 2023年6月6日
    095
  • 迭代

    1.迭代的概念: 迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次”迭代”,而每一次迭代得到的结果会作为下一次迭代的…

    Linux 2023年6月8日
    095
  • Putty&Psftp命令行实现自动登录

    | 0.18分钟 | 292.8字符 | 1、引言&背景 2、解决方案 3、声明与参考资料 | SCscHero | 2022/1/22 PM6:0 | 系列 | 已完成 …

    Linux 2023年5月27日
    086
  • 我叫Mongo,干了「查询终结篇」,值得您拥有

    这是mongo第三篇”查终结篇”,后续会连续更新5篇 mongodb的文章总结上会有一系列的文章,顺序是先学会怎么用,在学会怎么用好,戒急戒躁,循序渐进,跟…

    Linux 2023年6月14日
    0120
  • Nginx几种负载均衡方式介绍

    Nginx几种负载均衡方式介绍 前言 负载均衡就是Nginx将请求分摊到不同的服务器中,保证服务的可用性,缓解服务压力,保证服务的响应速度,即使某一个应用服务不可用,也可以保证业务…

    Linux 2023年6月6日
    0104
  • python2.6.6安装Image模块

    python2.6.6安装Image模块1、下载Image模块源码地址:http://www.pythonware.com/products/pil/index.htm2、加压文件…

    Linux 2023年6月14日
    081
  • linux命令之tar 解压 压缩

    tar(全称:tape archive )命令用于备份文件。tar 是用来 创建或者 还原备份文件的工具程序,它可以加入,解开备份文件内的文件。tar linux说明 tar [&…

    Linux 2023年5月27日
    070
  • 使用ipmitool配置ipmi(远程控制卡)

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    082
  • Kubernetes后台数据库etcd:安装部署etcd集群,数据备份与恢复

    服务器版本 docker软件版本 CPU架构 CentOS Linux release 7.4.1708 (Core) Docker version 20.10.12 x86_64…

    Linux 2023年6月7日
    078
  • Linux之Nginx入门

    一、Nginx介绍 Nginx是一个开源且高性能、可靠的http web服务、代理服务。 开源:直接获取源代码 高性能:支持海量并发 可靠:服务稳定 高性能,高并发 Nginx支持…

    Linux 2023年5月27日
    086
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球