一、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. C# convert between Image and Base64string

    static void ImageMSDemo(string picPath) { byte[] imageArray = System.IO.File.ReadAllBytes(picPath); ...

  2. CSS3 过渡---transition

    过渡(transition)是CSS3中具有颠覆性的特征之一,我们可以在不使用 Flash 动画或 JavaScript 的情况下,当元素从一种样式变换为另一种样式时为元素添加效果. 过渡动画: 是从 ...

  3. hadoop mapreduce求解有序TopN

    利用hadoop的map和reduce排序特性实现对数据排序取TopN条数据. 代码参考:https://github.com/asker124143222/wordcount 1.样本数据,假设是订 ...

  4. 【JavaWeb】实现二级联动菜单

    实现效果 频道信息 package demo; public class Channel { private String code; //频道编码 private String name; //频道 ...

  5. 6-SQL子查询

    (1) 什么是关联子查询,什么是非关联子查询 (嵌套查询) 子查询从数据表中查询了数据结果,如果这个数据结果只执行一次,然后这个数据结果作为主查询的条件进行执行,那么这样的子查询叫做非关联子查询. 如 ...

  6. luoguP3531 [POI2012]LIT-Letters

    (https://www.luogu.org/problem/P3531) 注意编号 #include<cstdio> #include<algorithm> #include ...

  7. 6.gitlab 备份

    在配置文件有有默认的  备份路劲 sudo vim /etc/gitlab/gitlab.rb 默认在这个  路径下面 /var/opt/gitlab/backups 然后默认的备份时间是  7天 , ...

  8. Es6编程风格

    let 取代 var let 和 const 之间优先使用 const 字符串 静态字符串一律使用单引号或反引号,不使用双引号 动态字符串使用反引号 `` 解构赋值 使用数组成员对变量赋值时,优先使用 ...

  9. IntelliJ IDEA常用配置(三)

    提示:对于一些通用的设置可以配置成全局的. 1. 主题配置 File - Settings - Color Scheme,默认的是Default(一个白色主题),Darcula是一个黑色主题. 我们也 ...

  10. 第十周计划周二&周三计划

    今天又一次被导师训了,怎么也达不到他的要求,好像我俩不在一条线上.所以现在重新整理一遍思路,继续走. 我认为重点还是主题追踪这一块,但是主题追踪的结果以及显示是个问题,目前还是打算做出来当天最热的前几 ...