ARTS-week10

Algorithms

本周算法题:
count-and-say

思路:看题目看了好一会才理解,第i+1个字符串是第i个字符串的读法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
public:
string countAndSay(int n) {
if (n <= 0) {
return "";
}
string res = "1";
while (--n) {
string cur = "";
int j = 0;
for (int i = 0; i < res.size(); i += j) {
for(j = 0; j + i < res.size(); j++) {
if(res[i] != res[i+j]) {
break;
}
}
cur += to_string(j) + res[i];
}
res = cur;
}
return res;
}
};

Maximum Subarray

1
2
3
4
5
6
7
8
9
10
11
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int res = INT_MIN, curSum = 0;
for (int num : nums) {
curSum = max(curSum + num, num);
res = max(res, curSum);
}
return res;
}
};

Review

本周阅读英文文章 Fingerprinting

IDFA:适用于IOS设备的广告标识符
AAID:适用于Android设备的Google广告ID

指纹识别在移动设备上的准确度通常低于桌面设备。一个原因是桌面浏览器提供了更多的数据(例如窗口大小),可用于唯一地标识用户。在移动设备上,特别是IOS及其有限数量的设备类型,用于指纹识别的数据更加有限。

Technique

记录一下本周在《深入剖析Kubernetes》中学习到的Linux Cgroups的知识。

Linux Cgroups(Linux Control Group)是Linux内核中用来为进程设置资源限制的一个重要功能。它主要作用就是限制一个进程组能够使用的资源上限,包括CPU、内存、磁盘、网络带宽等。此外Cgroups还能对进程进行优先级设置、审计、以及将进程挂起和恢复等操作。

在Linux中,Cgroups给用户暴露出来的操作接口是文件系统,即它以文件和目录的方式组织在操作系统的/sys/fs/cgroup路径下。
在Ubuntu16.04中

1
2
3
4
5
6
7
8
9
10
11
12
$ mount -t cgroup 
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)

在 /sys/fs/cgroup下面有很多诸如 cpuset、cpu、 memory 这样的子目录,也叫子系统。而在子系统对应的资源种类下,可以看到该类资源具体可以被限制的方法。比如,对CPU子系统来说,我们就可以看到如下几个配置文件,这个指令是:

1
2
3
$ ls /sys/fs/cgroup/cpu
cgroup.clone_children cgroup.sane_behavior cpuacct.usage cpu.cfs_period_us cpu.shares docker notify_on_release system.slice user.slice
cgroup.procs cpuacct.stat cpuacct.usage_percpu cpu.cfs_quota_us cpu.stat init.scope release_agent tasks

cfs_period和cfs_quota需要组合使用,可以用来限制进行在长度为cfs_period的一段时间内,只能被分配到总量为cfs_quota的CPU时间。

如何使用这样的配置文件?

1
2
3
4
root@ubuntu:/sys/fs/cgroup/cpu$ mkdir container
root@ubuntu:/sys/fs/cgroup/cpu$ ls container/
cgroup.clone_children cpu.cfs_period_us cpu.rt_period_us cpu.shares notify_on_release
cgroup.procs cpu.cfs_quota_us cpu.rt_runtime_us cpu.stat tasks

这个目录就称为一个”控制组”。操作系统会在新创建的container目录自动生成该子系统对应的资源限制文件。

后台执行:

1
2
$ while : ; do : ; done &
[1] 4662

执行了一个死循环,将计算机的CPU打到100%,根据输出,可以看到PID是4662。

查看container目录下的文件,看到container控制组里的CPU quota还没有任何限制(即:-1),CPU period则是默认的100ms(100000 us)。

1
2
3
4
$ cat /sys/fs/cgroup/cpu/container/cpu.cfs_quota_us 
-1
$ cat /sys/fs/cgroup/cpu/container/cpu.cfs_period_us
100000

通过修改文件内容来限制:

1
$ echo 20000 > /sys/fs/cgroup/cpu/container/cpu.cfs_quota_us

它意味着在每100ms的时间里,被该控制组限制的进程只能使用20ms的CPU时间,也就是说这个进程只能使用到20%的CPU带宽。

接下来将被限制的PID写入container组里的tasks文件,上面的设置就会对该进程生效:

1
$ echo 4662 > /sys/fs/cgroup/cpu/container/tasks 

Share

本周分享在Ubuntu16.04上安装和使用Docker:
https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-16-04