Blog

道德许可(moral licensing)

Content #

明确驳斥性别歧视和种族歧视言论的学生,觉得自己已经获得了道德许可证。他们已经向自己证明了,他们没有性别歧视或种族歧视。这就让他们在心理学家所谓的“道德许可”(moral licensing)面前不堪一击。当你做善事的时候,你会感觉良好。这就意味着,你更可能相信自己的冲动。而冲动常常会允许你做坏事。在这个例子里,学生们因为驳斥了性别歧视和种族歧视的言论而感觉良好,因此放松了警惕,更容易做出有歧视色彩的决定。他们更可能根据直觉的偏好做出判断,而不去考虑这个决定和他们“追求公平”的目标是否一致。这并不是说他们想歧视。他们只是被自己之前良好的行为所蒙蔽,没看到这些决定会带来的伤害而已。

简单说来,只要我们的思想中存在正反两方,好的行为就总是允许我们做一点坏事。重要的是,这不是血糖含量低或缺乏意志力造成的。心理学家调查这些纵容自己的人时,他们都认为自己做决定时能够自控,没有失控。他们也没有罪恶感,相反,他们认为自己得到了奖励,并以此为傲。他们这样为自己辩解:“我已经这么好了,应该得到一点奖励。”这种对补偿的渴望常常使我们堕落。因为我们很容易认为,纵容自己就是对美德最好的奖励。

当你觉得自己像个圣人的时候,纵容自己的念头听起来没什么错。它听起来很正确,就像是你应得的一样。如果你自控的唯一动力就是成为一个足够好的人,那么每当你自我感觉良好的时候,你就会放弃自控。“道德许可”最糟糕的部分并不是它可疑的逻辑,而是它会诱使我们做出背离自己最大利益的事。它让我们相信,放弃节食、打破预算、多抽根烟这些不良行为都是对自己的“款待”。这很疯狂,但对大脑来说,它有可怕的诱惑力,能让你把“想做的事”变成“必须做的事”。

From #

自控力

cook:strace

跟踪子进程和子线程 #

# -f表示跟踪子进程和子线程,-T表示显示系统调用的时长,-tt表示显示跟踪时间
$ strace -f -T -tt -p 9085
[pid  9085] 14:20:16.826131 epoll_pwait(5, [{EPOLLIN, {u32=8, u64=8}}], 10128, 65, NULL, 8) = 1 <0.000055>
[pid  9085] 14:20:16.826301 read(8, "*2\r\n$3\r\nGET\r\n$41\r\nuuid:5b2e76cc-"..., 16384) = 61 <0.000071>
[pid  9085] 14:20:16.826477 read(3, 0x7fff366a5747, 1) = -1 EAGAIN (Resource temporarily unavailable) <0.000063>
...
[pid  9085] 14:20:16.828760 write(7, "*3\r\n$4\r\nSADD\r\n$4\r\ngood\r\n$36\r\n535"..., 67) = 67 <0.000060>
[pid  9085] 14:20:16.828970 fdatasync(7) = 0 <0.005415>
[pid  9085] 14:20:16.834493 write(8, ":1\r\n", 4) = 4 <0.000250>

观察指定的系统调用 #

$ strace -f -p 9085 -T -tt -e fdatasync
strace: Process 9085 attached with 4 threads
[pid  9085] 14:22:52.013547 fdatasync(7) = 0 <0.007112>
[pid  9085] 14:22:52.022467 fdatasync(7) = 0 <0.008572>
[pid  9085] 14:22:52.032223 fdatasync(7) = 0 <0.006769>
...
[pid  9085] 14:22:52.139629 fdatasync(7) = 0 <0.008183>

PSS(Proportional Set Size)

Content #

The “proportional set size” (PSS) of a process is the count of pages it has in memory, where each page is divided by the number of processes sharing it. So if a process has 1000 pages all to itself, and 1000 shared with one other process, its PSS will be 1500.

每个进程的 PSS ,是指把共享内存平分到各个进程后,再加上进程本身的非共享内存大小的和。

这个例子中,一个进程的非共享内存为 1000 页,它和另一个进程的共享进程也是 1000 页,那么它的 PSS=1000/2+1000=1500 页。

这样,你就可以直接累加 PSS ,不用担心共享内存重复计算的问题了。

比如,你可以运行下面的命令来计算:

# 使用grep查找Pss指标后,再用awk计算累加值
$ grep Pss /proc/[1-9]*/smaps | awk '{total+=$2}; END {printf "%d kB\n", total }'
391266 kB

Viewpoints #

From #

22 | 答疑(三):文件系统与磁盘的区别是什么?

...

观察/proc/zoneinfo

Content #

通过 /proc/zoneinfo ,观察剩余内存、内存阈值以及匿名页和文件页的活跃情况。

# -d 表示高亮变化的字段
# -A 表示仅显示Normal行以及之后的15行输出
$ watch -d grep -A 15 'Normal' /proc/zoneinfo
Node 0, zone   Normal
  pages free     21328
        min      14896
        low      18620
        high     22344
        spanned  1835008
        present  1835008
        managed  1796710
        protection: (0, 0, 0, 0, 0)
      nr_free_pages 21328
      nr_zone_inactive_anon 79776
      nr_zone_active_anon 206854
      nr_zone_inactive_file 918561
      nr_zone_active_file 496695
      nr_zone_unevictable 2251
      nr_zone_write_pending 0

剩余内存(pages_free)在一个小范围内不停地波动。当它小于页低阈值(pages_low) 时,又会突然增大到一个大于页高阈值(pages_high)的值。

Viewpoints #

From #

20 | 案例篇:为什么系统的Swap变高了?(下)

查看使用Swap最多的进程

Content #

按VmSwap使用量对进程排序,输出进程名称、进程ID以及SWAP用量

$ for file in /proc/*/status ; do
awk '/VmSwap|Name|^Pid/{printf $2 " " $3}END{ print ""}' $file;
done | sort -k 3 -n -r | head
dockerd 2226 10728 kB
docker-containe 2251 8516 kB
snapd 936 4020 kB
networkd-dispat 911 836 kB
polkitd 1004 44 kB

可以看到,使用 Swap 比较多的是 dockerd 和 docker-containe 进程,所以,当 dockerd 再次访问这些换出到磁盘的内存时,也会比较慢。

Viewpoints #

From #

20 | 案例篇:为什么系统的Swap变高了?(下)

sar查看内存指标

Content #

sar 查看内存各个指标的变化情况。

# 间隔1秒输出一组数据
# -r表示显示内存使用情况,-S表示显示Swap使用情况
$ sar -r -S 1
04:39:56    kbmemfree   kbavail kbmemused  %memused kbbuffers  kbcached  kbcommit  %commit  kbactive   kbinact   kbdirty
04:39:57      6249676   6839824   1919632     23.50    740512     67316   1691736     10.22    815156    841868         4

04:39:56    kbswpfree kbswpused  %swppused  kbswpcad   %swpcad
04:39:57      8388604         0      0.00         0      0.00

sar 的输出结果是两个表格,第一个表格表示内存的使用情况,第二个表格表示 Swap 的使用情况。其中,各个指标名称前面的 kb 前缀,表示这些指标的单位是 KB。

  1. kbcommit,表示当前系统负载需要的内存。它实际上是为了保证系统内存不溢出,对需要内存的估计值。%commit,就是这个值相对总内存的百分比。
  2. kbactive,表示活跃内存,也就是最近使用过的内存,一般不会被系统回收。
  3. kbinact,表示非活跃内存,也就是不常访问的内存,有可能会被系统回收。

假定总的内存使用率(%memused)在不断增长,从开始的 23% 一直长到了 98%,并且主要内存都被缓冲区(kbbuffers)占用。具体来说:

  1. 刚开始,剩余内存(kbmemfree)不断减少,而缓冲区(kbbuffers)则不断增大,由此可知,剩余内存不断分配给了缓冲区。
  2. 一段时间后,剩余内存已经很小,而缓冲区占用了大部分内存。这时候, Swap 的使用开始逐渐增大,缓冲区和剩余内存则只在小范围内波动。

Viewpoints #

From #

20 | 案例篇:为什么系统的Swap变高了?(下)

...

kswapd0定期回收内存

Content #

专门的内核线程用来定期回收内存,也就是 kswapd0。为了衡量内存的使用情况, kswapd0 定义了三个内存阈值(watermark,也称为水位),分别是:

  1. 页最小阈值(pages_min)
  2. 页低阈值(pages_low)
  3. 页高阈值(pages_high)

剩余内存,则使用 pages_free 表示。

kswapd0 定期扫描内存的使用情况,并根据剩余内存落在这三个阈值的空间位置,进行内存的回收操作。

  1. 剩余内存小于页最小阈值,说明进程可用内存都耗尽了,只有内核才可以分配内存。
  2. 剩余内存落在页最小阈值和页低阈值中间,说明内存压力比较大,剩余内存不多了。这时 kswapd0 会执行内存回收,直到剩余内存大于高阈值为止。
  3. 剩余内存落在页低阈值和页高阈值中间,说明内存有一定压力,但还可以满足新内存请求。
  4. 剩余内存大于页高阈值,说明剩余内存比较多,没有内存压力。

一旦剩余内存小于页低阈值,就会触发内存的回收。这个页低阈值,其实可以通过内核选项 /proc/sys/vm/min_free_kbytes 来间接设置。min_free_kbytes 设置了页最小阈值,而其他两个阈值,都是根据页最小阈值计算生成的,计算方法如下 :

pages_low = pages_min*5/4
pages_high = pages_min*3/2

Viewpoints #

From #

19 | 案例篇:为什么系统的Swap变高了(上)

脏页写入磁盘的两种方式

Content #

大部分文件页(File-backed Page),都可以直接回收,以后有需要时,再从磁盘重新读取就可以了。而那些被应用程序修改过,并且暂时还没写入磁盘的数据(也就是脏页),就得先写入磁盘,然后才能进行内存释放。

这些脏页,一般可以通过两种方式写入磁盘。

  1. 可以在应用程序中,通过系统调用 fsync ,把脏页同步到磁盘中;

  2. 也可以交给系统,由内核线程 pdflush 负责这些脏页的刷新。

Viewpoints #

From #

19 | 案例篇:为什么系统的Swap变高了(上)

file-backed and anonymous

file-backed and anonymous

Content #

User-accessible memory on a Linux system is divided into two broad classes: file-backed and anonymous.

File-backed pages (or page-cache pages) correspond to a segment of a file on disk; if they do not contain newly written data that has not yet made it back to persistent storage, these pages can be easily reclaimed for other uses.

Anonymous pages do not correspond to a file on disk; they hold the run-time data generated and used by a process. Reclaiming an anonymous page requireswriting its contents to the swap device.

...