一、cgroup简介

  Linux CGroup全称Linux Control Group, 是Linux内核的一个功能,用来限制,控制与分离一个进程组群的资源(如CPU、内存、磁盘输入输出等)。这个项目最早是由Google的工程师在2006年发起(主要是Paul Menage和Rohit Seth),最早的名称为进程容器(process containers)。在2007年时,因为在Linux内核中,容器(container)这个名词太过广泛,为避免混乱,被重命名为cgroup,并且被合并到2..24版的内核中去。然后,其它开始了他的发展。 

  Linux CGroupCgroup 可​​​让​​​您​​​为​​​系​​​统​​​中​​​所​​​运​​​行​​​任​​​务​​​(进​​​程​​​)的​​​用​​​户​​​定​​​义​​​组​​​群​​​分​​​配​​​资​​​源​​​ — 比​​​如​​​ CPU 时​​​间​​​、​​​系​​​统​​​内​​​存​​​、​​​网​​​络​​​带​​​宽​​​或​​​者​​​这​​​些​​​资​​​源​​​的​​​组​​​合​​​。​​​您​​​可​​​以​​​监​​​控​​​您​​​配​​​置​​​的​​​ cgroup,拒​​​绝​​​ cgroup 访​​​问​​​某​​​些​​​资​​​源​​​,甚​​​至​​​在​​​运​​​行​​​的​​​系​​​统​​​中​​​动​​​态​​​配​​​置​​​您​​​的​​​ cgroup。

主要功能:

 限制资源使用,比如内存使用上限以及文件系统的缓存限制。
优先级控制,CPU利用和磁盘IO吞吐。
一些审计或一些统计,主要目的是为了计费。
挂起进程,恢复执行进程。

cgroups子系统:

 cpu 子系统,主要限制进程的 cpu 使用率。
cpuacct 子系统,可以统计 cgroups 中的进程的 cpu 使用报告。
cpuset 子系统,可以为 cgroups 中的进程分配单独的 cpu 节点或者内存节点。
memory 子系统,可以限制进程的 memory 使用量。
blkio 子系统,可以限制进程的块设备 io。
devices 子系统,可以控制进程能够访问某些设备。
net_cls 子系统,可以标记 cgroups 中进程的网络数据包,然后可以使用 tc 模块(traffic control)对数据包进行控制。
net_prio — 这个子系统用来设计网络流量的优先级
freezer 子系统,可以挂起或者恢复 cgroups 中的进程。
ns 子系统,可以使不同 cgroups 下面的进程使用不同的 namespace
hugetlb — 这个子系统主要针对于HugeTLB系统进行限制,这是一个大页文件系统。

cgred简介

Cgred 是​​​一​​​个​​​守​​​护​​​进​​​程​​​,它​​​可​​​根​​​据​​​在​​​ /etc/cgrules.conf 文​​​件​​​中​​​设​​​定​​​的​​​参​​​数​​​将​​​任​​​务​​​移​​​动​​​到​​​ cgroup 中​​​。​​​/etc/cgrules.conf 文​​​件​​​中​​​的​​​条​​​目​​​可​​​以​​​使​​​用​​​以​​​下​​​两​​​个​​​格​​​式​​​之​​​一​​​:
user hierarchies control_group
user:command hierarchies control_group
例​​​如​​​:
maria devices /usergroup/staff
这​​​个​​​条​​​目​​​指​​​定​​​任​​​何​​​属​​​于​​​名​​​为​​​ maria 用​​​户​​​的​​​进​​​程​​​根​​​据​​​在​​​ /usergroup/staff cgroup 中​​​指​​​定​​​的​​​参​​​数​​​访​​​问​​​设​​​备​​​子​​​系​​​统​​​。​​​要​​​将​​​具​​​体​​​命​​​令​​​与​​​具​​​体​​​ cgroup 关​​​联​​​,请​​​添​​​加​​​ command 参​​​数​​​,如​​​下​​​:
maria:ftp devices /usergroup/staff/ftp
该​​​条​​​目​​​现​​​在​​​指​​​定​​​何​​​时​​​名​​​为​​​ maria 的​​​用​​​户​​​使​​​用​​​ ftp 命​​​令​​​,自​​​动​​​将​​​该​​​进​​​程​​​移​​​动​​​到​​​包​​​含​​​ devices 子​​​系​​​统​​​的​​​层​​​级​​​中​​​的​​​ /usergroup/staff/ftp cgroup 中​​​。​​​请​​​注​​​意​​​:该​​​守​​​护​​​进​​​程​​​只​​​有​​​在​​​符​​​合​​​适​​​当​​​的​​​条​​​件​​​后​​​才​​​可​​​将​​​该​​​进​​​程​​​移​​​动​​​到​​​该​​​ cgroup 中​​​。​​​因​​​此​​​,ftp 可​​​能​​​会​​​在​​​错​​​误​​​的​​​组​​​群​​​中​​​短​​​暂​​​运​​​行​​​。​​​再​​​有​​​,如​​​果​​​该​​​进​​​程​​​在​​​错​​​误​​​组​​​群​​​中​​​迅​​​速​​​生​​​出​​​子​​​进​​​程​​​,则​​​不​​​会​​​移​​​动​​​这​​​些​​​子​​​进​​​程​​​。​​​
/etc/cgrules.conf 文​​​件​​​中​​​的​​​条​​​目​​​可​​​包​​​括​​​以​​​下​​​额​​​外​​​符​​​号​​​:
@ - 当​​​在​​​ user 使​​​用​​​前​​​缀​​​时​​​,代​​​表​​​是​​​一​​​个​​​组​​​群​​​而​​​不​​​是​​​单​​​独​​​用​​​户​​​。​​​例​​​如​​​:@admins 是​​​ admins 组​​​群​​​中​​​的​​​所​​​有​​​用​​​户​​​。​​​
* - 代​​​表​​​“​​​所​​​有​​​”​​​。​​​例​​​如​​​:subsystem 字​​​段​​​中​​​的​​​ * 代​​​表​​​所​​​有​​​子​​​系​​​统​​​。​​​
% - 代​​​表​​​与​​​以​​​上​​​行​​​中​​​项​​​目​​​相​​​同​​​的​​​项​​​目​​​。​​​例​​​如​​​:
@adminstaff devices /admingroup
@labstaff % %

小结:通过cgroup设置我们想要的规则,通过cgred将规则应用到进程之上

二、CPU限制

1.查看已经使用的子系统

[root@reddhat6_155_200 ~]# lssubsys -m
cpuset /cgroup/cpuset
cpu /cgroup/cpu
cpuacct /cgroup/cpuacct
memory /cgroup/memory
devices /cgroup/devices
freezer /cgroup/freezer
net_cls /cgroup/net_cls
blkio /cgroup/blkio

2.编辑cgroup配置文件,添加两个group对CPU使用率的限制

[root@reddhat6_155_200 ~]# vim /etc/cgconfig.conf  #添加以下两段
group lesscpu{
cpu{ }
} group morecpu{
cpu{
}
}

3.重启并查看CPU子系统目录

[root@reddhat6_155_200 ~]# /etc/init.d/cgconfig restart
Stopping cgconfig service: [确定]
Starting cgconfig service: [确定]
[root@reddhat6_155_200 ~]# ll /cgroup/cpu
总用量
--w--w--w-. root root -- : cgroup.event_control
-rw-r--r--. root root -- : cgroup.procs
-rw-r--r--. root root -- : cpu.cfs_period_us
-rw-r--r--. root root -- : cpu.cfs_quota_us
-rw-r--r--. root root -- : cpu.rt_period_us
-rw-r--r--. root root -- : cpu.rt_runtime_us
-rw-r--r--. root root -- : cpu.shares
-r--r--r--. root root -- : cpu.stat
drwxr-xr-x. root root -- : lesscpu #多出两个目录,和我们定义的group名称是一至的
drwxr-xr-x. root root -- : morecpu
-rw-r--r--. root root -- : notify_on_release
-rw-r--r--. root root -- : release_agent
-rw-r--r--. root root -- : tasks

4.查看目录内容

[root@reddhat6_155_200 ~]# ll /cgroup/cpu         仔细观察可以发现每个目录中的文件都是相同的,也就是默认情况下group会继承该子系统的所有规则
[root@reddhat6_155_200 ~]# ll /cgroup/cpu/morecpu/
[root@reddhat6_155_200 ~]# ll /cgroup/cpu/morecpu/

5.添加group规则

[root@reddhat6_155_200 ~]# cat /cgroup/cpu/cpu.shares  #cpu.shares表示程序可以在​​​ cgroup 中​​​的​​​任​​​务​​​可​​​用​​​的​​​相​​​对​​​共​​​享​​​ CPU 时​​​间​​​的​​​整​​​数​​​值​​​,默认为1024

[root@reddhat6_155_200 ~]# vim /etc/cgconfig.conf
group lesscpu{
cpu{
cpu.shares=; #该值不可以超过总大小(1024)
}
} group morecpu{
cpu{
cpu.shares=;
}
}
[root@reddhat6_155_200 ~]# /etc/init.d/cgconfig restart
Stopping cgconfig service: [确定]
Starting cgconfig service: [确定]

[root@reddhat6_155_200 ~]# cat /cgroup/cpu/lesscpu/cpu.shares
 100
 [root@reddhat6_155_200 ~]# cat /cgroup/cpu/morecpu/cpu.shares
 200

6.为了减少演示的复杂度,我们下线其他CPU,只保留一个CPU

[root@reddhat6_155_200 ~]# lscpu |grep -A   "^CPU\(s\):"  #查看当前CPU个数及在线个数
CPU(s):
On-line CPU(s) list: ,
[root@reddhat6_155_200 ~]# echo > /sys/devices/system/cpu/cpu1/online #将cpu1下线,cpu0为主cpu无法下线
[root@reddhat6_155_200 ~]# lscpu |grep -A "^CPU\(s\):" #查看在线状态,目前只有cpu0在线
CPU(s):
On-line CPU(s) list:

7.新开一个窗口,同时执行dd命令,分别选择lesscpu和morecpu

[root@reddhat6_155_200 ~]# cgexec -g cpu:lesscpu time dd if=/dev/zero of=/dev/null bs=1M count=   #窗口1 分配少的先执行
[root@reddhat6_155_200 ~]# cgexec -g cpu:morecpu time dd if=/dev/zero of=/dev/null bs=1M count= #窗口2
[root@reddhat6_155_200 ~]# top #窗口3 使用top命令监控命令状态

注意观察两个dd命令CPU使用率

lesscpu结果:

[root@reddhat6_155_200 ~]# cgexec -g cpu:lesscpu time dd if=/dev/zero of=/dev/null bs=1M count=
记录了200000+ 的读入
记录了200000+ 的写出
209715200000字节( GB)已复制,21.7357 秒,9.6 GB/秒 #注意CPU使用时间
.01user .83system :.73elapsed %CPU (0avgtext+0avgdata 7776maxresident)k #注意CPU使用率
0inputs+0outputs (0major+521minor)pagefaults 0swaps

morecpu结果:

[root@reddhat6_155_200 ~]# cgexec -g cpu:morecpu time dd if=/dev/zero of=/dev/null bs=1M count=
记录了200000+ 的读入
记录了200000+ 的写出
209715200000字节( GB)已复制,16.26 秒,12.9 GB/秒
.02user .77system :.26elapsed %CPU (0avgtext+0avgdata 7744maxresident)k
0inputs+0outputs (0major+519minor)pagefaults 0swaps

三、MEM限制

1.编辑cgroup配置文件,添加一个mem限制

[root@reddhat6_155_200 ~]# cat /cgroup/memory/memory.limit_in_bytes  #查看MEM(物理内存)默认限制大小 单位为字节 以目前机器配置,等同于无限制

[root@reddhat6_155_200 ~]# cat /cgroup/memory/memory.memsw.limit_in_bytes #查看MEM(物理内存)+Swap总的大小 此值必须大于等于 memory.limit_in_bytes [root@reddhat6_155_200 ~]# vim /etc/cgconfig.conf #添加一个MEM 限制
group poormem{
memory{
memory.limit_in_bytes=; #限制可以使用内存大小为256M
}
[root@reddhat6_155_200 ~]# /etc/init.d/cgconfig restart
Stopping cgconfig service: [确定]
Starting cgconfig service: [确定]
[root@reddhat6_155_200 ~]# cat /cgroup/memory/poormem/memory.limit_in_bytes
268435456

2.创建一个内存盘

[root@reddhat6_155_200 ~]# mkdir /mnt/tmpfs
[root@reddhat6_155_200 ~]# mount -t tmpfs none /mnt/tmpfs #注意没有挂载源 使用none
[root@reddhat6_155_200 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_redhat6demo01-lv_root
50G .4G 42G % /
tmpfs .0G 224K .0G % /dev/shm
/dev/vda1 477M 33M 419M % /boot
/dev/mapper/vg_redhat6demo01-lv_home
.5G 12M .2G % /home
none .0G .0G % /mnt/tmpfs #大小2G,具体大小和系统剩余内存大小有关

3.测试tmpfs特性

[root@reddhat6_155_200 ~]# free -m  #查看当前内存大小
total used free shared buffers cached
Mem:
-/+ buffers/cache:
Swap:
[root@reddhat6_155_200 ~]# dd if=/dev/zero of=/mnt/tmpfs/test bs=1M count=1000 #向 tmpfs 挂载点写入1G内存
记录了1000+ 的读入
记录了1000+ 的写出
1048576000字节(1.0 GB)已复制,0.466811 秒,2.2 GB/秒
[root@reddhat6_155_200 ~]# free -m #查看系统内存 少了1G
total used free shared buffers cached
Mem:
-/+ buffers/cache:
Swap:
[root@reddhat6_155_200 ~]# rm -f /mnt/tmpfs/test #删除刚刚创建的文件
[root@reddhat6_155_200 ~]# free -m #查看当前剩余内存
total used free shared buffers cached
Mem:
-/+ buffers/cache:
Swap:

4.测试

[root@reddhat6_155_200 ~]# cgexec -g memory:poormem dd if=/dev/zero of=/mnt/tmpfs/test bs=1M count=200 #配置的为256M 先创建一个200M 测试文件
记录了200+ 的读入
记录了200+ 的写出
209715200字节( MB)已复制,0.097221 秒,2.2 GB/秒
[root@reddhat6_155_200 ~]# rm -f /mnt/tmpfs/test
[root@reddhat6_155_200 ~]# cgexec -g memory:poormem dd if=/dev/zero of=/mnt/tmpfs/test bs=1M count=300 #创建一个300M测试文件 挂了 很奇怪,按照文档说明此处不应该挂的,应该不够的会从Swap中读取 只有 memory.memsw.limit_in_bytes 也设置了才会限制从Swap中读取 不知道为啥??????
已杀死 [root@reddhat6_155_200 ~]# ll -h /mnt/tmpfs/test #查看大小只有
255M -rw-r--r--. root root 255M -- : /mnt/tmpfs/test

四、磁盘IO限制  #使用IO限制时当前系统调度算法必须为cfq算法

[root@reddhat6_155_200 ~]# cat /sys/block/vda/queue/scheduler   #查看下当前系统磁盘调度算法 vda表示磁盘名称
noop anticipatory deadline [cfq]
[root@reddhat6_155_200 ~]# cat /cgroup/blkio/blkio.weight #查看磁盘io权重默认值

[root@reddhat6_155_200 ~]# vim /etc/cgconfig.conf #创建io限制规则
group lowio{
blkio{
blkio.weight=; #设置io优先级 一个低 一个高
}
} group highio{
blkio{
blkio.weight=;
}
} group ddio{
blkio{
blkio.throttle.read_bps_device="252:0 1000000";
#限制程序读取磁盘的速度 252表示当前主盘符号 0表示副盘符号 1000000表示读取速率 单位为字节 即1M 需要注意的是,如果是物理设备 SCSI设备重启后主副盘符会发生变化 可以通过设置逻辑卷
}

}
[root@reddhat6_155_200 ~]# /etc/init.d/cgconfig restart
Stopping cgconfig service: [确定]
Starting cgconfig service: [确定]

测试

[root@reddhat6_155_200 ~]# dd if=/dev/zero of=/root/bigfile1 bs=1M count=10000 #创建两个大的文件用于实验
[root@reddhat6_155_200 ~]# dd if=/dev/zero of=/root/bigfile2 bs=1M count=
[root@reddhat6_155_200 ~]# echo > /proc/sys/vm/drop_caches #情况缓存 避免影响结果
[root@reddhat6_155_200 ~]# iotop #使用iotop命令监控io状态

新开两个窗口,分别使用lowio和highio

[root@reddhat6_155_200 ~]# cgexec -g blkio:lowio time cat /root/bigfile1 > /dev/null
[root@reddhat6_155_200 ~]# cgexec -g blkio:highio time cat /root/bigfile2 > /dev/null

结果:当两个cat命令都读取时,使用highio磁盘速度大约是lowio的两倍

当highio执行完成后lowio开始独占磁盘io

[root@reddhat6_155_200 ~]# cgexec -g blkio:lowio time cat /root/bigfile1 > /dev/null
.08user .52system :.54elapsed %CPU (0avgtext+0avgdata 2416maxresident)k
20480360inputs+0outputs (1major+182minor)pagefaults 0swaps [root@reddhat6_155_200 ~]# cgexec -g blkio:highio time cat /root/bigfile2 > /dev/null
.08user .16system :.64elapsed %CPU (0avgtext+0avgdata 2432maxresident)k
20480072inputs+0outputs (1major+183minor)pagefaults 0swaps

限制指定用户执行指定命令

[root@reddhat6_155_200 ~]# vim /etc/cgrules.conf
admin:dd blkio ddio/ #此行配置表示 admin用户执行dd命令时 使用 blkio子系统下ddio group进行限制 此处不仅可以现在命令也可以现在程序 添加程序的启动命令即可 例 nginx java等
[root@reddhat6_155_200 ~]# /etc/init.d/cgred restart
正在停止 CGroup Rules Engine 守护进程...... [确定]
Starting CGroup Rules Engine Daemon: [确定]

使用root用户测试dd命令

[root@reddhat6_155_200 ~]# dd if=/tmp/bigfile1 of=/dev/null
记录了20480000+ 的读入
记录了20480000+ 的写出
10485760000字节( GB)已复制,18.5243 秒, MB/秒 #速度正常

切换至admin用户执行dd命令

[root@reddhat6_155_200 ~]# mv /root/bigfile1 /tmp/
[root@reddhat6_155_200 ~]# su - admin
[admin@reddhat6_155_200 ~]$ dd if=/tmp/bigfile1 of=/dev/null

新开一个窗口,使用iotop命令监控

[admin@reddhat6_155_200 ~]$ dd if=/tmp/bigfile1 of=/dev/null
记录了210657+ 的读入
记录了210656+ 的写出
107855872字节( MB)已复制,107.986 秒, kB/秒 #注意此处的速率 时间是因为我提前中断了程序

我们发现,无论怎样,IO读取不会大于1M

注意事项:

 磁盘IO调度算法必须为cfq
测试前需要先清空磁盘缓存
不要使用SSD硬盘
读取速率注意SCSI物理硬盘盘符会随机更改

五、创建两个及以上资源控制子系统(默认每种资源只能单独控制)

1.修改配置文件,配置一个多控制项的子系统

[root@reddhat6_155_200 ~]# vim /etc/cgconfig.conf
mount {
cpuset = /cgroup/cpuset;
# cpu = /cgroup/cpu; #以CPU内存为例,注释cpu、memory字段
cpuacct = /cgroup/cpuacct;
# memory = /cgroup/memory;
cpu = /cgroup/cpumem; #新添加cpu、memory字段将其路径指向同一路径
memory = /cgroup/cpumem;
devices = /cgroup/devices;
freezer = /cgroup/freezer;
net_cls = /cgroup/net_cls;
blkio = /cgroup/blkio;
}

2.重启服务(注意:重启时需要退出/cgroup目录,否则会重启失败)

[root@reddhat6_155_200 ~]# /etc/init.d/cgconfig restart
Stopping cgconfig service: [确定]
Starting cgconfig service: [确定]

3.检查目录

[root@reddhat6_155_200 ~]# ll /cgroup/
总用量
drwxr-xr-x. root root -- : blkio
drwxr-xr-x. root root -- : cpu
drwxr-xr-x. root root -- : cpuacct
drwxr-xr-x. root root -- : cpumem #我们自定义的
drwxr-xr-x. root root -- : cpuset
drwxr-xr-x. root root -- : devices
drwxr-xr-x. root root -- : freezer
drwxr-xr-x. root root -- : memory
drwxr-xr-x. root root -- : net_cls
[root@reddhat6_155_200 ~]# ll /cgroup/cpu #原先的cpu及memory已经失效了
总用量
[root@reddhat6_155_200 ~]# ll /cgroup/memory/
总用量
[root@reddhat6_155_200 ~]# ll /cgroup/cpumem/ #所有mem和cpu配置都在cpumem目录下
总用量
--w--w--w-. root root -- : cgroup.event_control
-rw-r--r--. root root -- : cgroup.procs
-rw-r--r--. root root -- : cpu.cfs_period_us
-rw-r--r--. root root -- : cpu.cfs_quota_us
-rw-r--r--. root root -- : cpu.rt_period_us
-rw-r--r--. root root -- : cpu.rt_runtime_us
-rw-r--r--. root root -- : cpu.shares
-r--r--r--. root root -- : cpu.stat
-rw-r--r--. root root -- : memory.failcnt
--w-------. root root -- : memory.force_empty
......

参考文档:https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/6/html/resource_management_guide/sec-moving_a_process_to_a_control_group#The_cgred_Daemon

centos6 cgroup及cgred简介和简单使用的更多相关文章

  1. C#可扩展编程之MEF学习笔记(一):MEF简介及简单的Demo

    在文章开始之前,首先简单介绍一下什么是MEF,MEF,全称Managed Extensibility Framework(托管可扩展框架).单从名字我们不难发现:MEF是专门致力于解决扩展性问题的框架 ...

  2. knockout.js的简介和简单使用

    1.knockout简介knockout是一个轻量级的UI类库,通过MVVM模式使JavaScript前端UI简单化knockout有四大重要概念:1)声明式绑定:使用简明移读的语法很容易地将模型(m ...

  3. MEF简介及简单的Demo

    MEF简介及简单的Demo 文章开始之前,首先简单介绍一下什么是MEF,MEF,全称Managed Extensibility Framework(托管可扩展框架).单从名字我们不难发现:MEF是专门 ...

  4. Redis简介与简单安装

    Redis简介与简单安装   一.NoSQL的风生水起 1.1 后Web2.0时代的发展要求 随着互联网Web2.0网站的兴起,传统的关系数据库在应付Web2.0网站,特别是超大规模和高并发的SNS类 ...

  5. gtest简介及简单使用

    本文摘自 gtest简介及简单使用 ,在此感谢作者的分享. 具体使用教程 _______________________________________________________________ ...

  6. webUI框架miniUI,easyUI,extJS,Bootstrap简介及简单部署

    本文为大家讲解的是webUI框架miniUI,easyUI,extJS,Bootstrap简介及简单部属,感兴趣的同学参考下 ExtJS是一种主要用于创建前端用户界面,是一个基本与后台技术无关的前端a ...

  7. Cgroup与LXC简介

    原文地址: https://blog.51cto.com/speakingbaicai/1359825 一.Docker.LXC.Cgroup的结构关系 根据Docker布道师Jerome Petaz ...

  8. (转)Web Service入门简介(一个简单的WebService示例)

    Web Service入门简介 一.Web Service简介 1.1.Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从I ...

  9. Web Service入门简介(一个简单的WebService示例)

    Web Service入门简介 一.Web Service简介 1.1.Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从I ...

随机推荐

  1. 常用的js、java编码解码方法

    前言 前后端直接传输数据进行交互不就行了吗,为什么还要进行编码解码?正常情况下直接交互没问题,但当有类似以下情况出现时就需要进行编码再进行传输: 1.编码格式难以统一,导致数据交互过程出现中文乱码等问 ...

  2. python将oracle数据库保存到excel

    上代码: import pandas as pd import SqlHelper.ORACLE as ORA if __name__ == '__main__': #连接数据库 ms = ORA.O ...

  3. PHP+Ajax手机移动端发红包实例

    基本流程:当输入完红包数量和总金额后,PHP会根据这两个值进行随机分配每个金额,保证每个人都能领取到一个红包,且每个红包金额不等,并且所有红包金额总额等于总金额. 实现原理:设定总金额为10元,有N个 ...

  4. 使用原生Ajax进行用户名重复的检验

    title: 使用原生Ajax进行用户名重复的检验(一) date: 2019-01-21 17:35:15 tags: [JavaScript,Ajax] --- Ajax的复习 距离刚开始学aja ...

  5. qt 使用OpenCV

    使用MinGW编译OpenCV源码 下载OpenCV源码.CMake编译工具 编译安装完: Qt工程配置 INCLUDEPATH += D:/qt_work/opencv/build/install/ ...

  6. Saltstack_使用指南08_远程执行-返回程序

    1. 主机规划 salt 版本 [root@salt100 ~]# salt --version salt (Oxygen) [root@salt100 ~]# salt-minion --versi ...

  7. postman---postman发送请求

    前面简单的介绍了Postman的页面介绍和功能介绍,今天我们一起学习postman如何发送请求 发送请求 我们介绍过http协议有多种请求方式,各个请求方法都代表不同的结果.例如,GET使您可以从服务 ...

  8. CUDA -- 内存分配

    CUDA可以认为是一个由软件和硬件构成的并行计算系统,其依赖于GPU的并行计算单元,CUDA有类C的API,方便程序编写.其依赖于CPU和GPU的异构体系,通过在CPU上串行执行环境初始化.内存分配. ...

  9. 9.Java基础_for/while/do-while循环

    /* for循环(同C++) 初始化变量的作用域为循环体 出了循环体,初始化的局部变量消失 for(初始化;条件判断;条件控制){ 循环体; } while循环 while(条件判断){ 循环体; } ...

  10. 5. Vue - 小清单实例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...