「atop」

ATop,监控系统资源及进程活动;
ATop 与 top 命令类似,但只显示活动的系统资源和进程,并且仅显示自上一个间隔以来的偏差。它定期显示与 CPU,内存,SWAP,磁盘和网络层相关的系统级活动,并显示每个活动进程在系统和用户模式下的 CPU 利用率、虚拟、长驻内存增长、优先级、用户名、状态和退出码。对于在最后一个时间间隔内完成的进程,还会显示进程级别的活动,以获得有关诸如 CPU 时间之类的消耗的完整概述;
安装
从发行版的源中安装

# Ubuntu 16.04.2 LTS
apt-get install atop

从源码中安装 参考源码目录下的 README 文件;
安装的可执行程序
atop,用于监控 Linux 系统资源及负载;
atopsar,在系统级别,报告统计;
参考文献

Homepage: http://atoptool.nl/[……]

READ MORE

「Troubleshooting」

RCA – Root Cause Analysis
OODA – OODA loop
相关链接
「Wikipedia/Troubleshooting」 「Wikipedia/Root cause analysis」 「Wikipedia/OODA loop」
相关问题
设备已经移除,但是lsblk仍然显示设备 How to remove entries from lsblk?[……]

READ MORE

「Linux Performance」- 处理器性能排查(经验总结)

基础知识
平均负载 => Load Average
上下文切换(自愿、非自愿) => Context switch
处理器使用率(相关指标) => CPU utilization
不可中断进程、僵尸进程 => Linux process states
软中断 => interrupts and softirqs
处理器缓存命中率、
排查工具
经验总结
第一步、检查平均负载
当系统平均负载较高时,使用 mpstat -P ALL 查看负载较高的原因(比如 usr、sys、iowait 比例),以确定是进程数过度,还是 IO 压力较大。
然后使用 pidstat -u 查看进程的处理器资源使用情况,定位使用处理器资源较多的进程。
=> 接下来要确定为什么进程会使用过多资源(CPU 或 I/O)
第二步、检查上下文切换
使用 vmstat 查看上下文切换状态、运行中进程数量、不可中断进程数量、中断次数,找到数据异常的地方。比如:进程数远高于处理器数,会带来负载;上下问切换数量过高带来的负载;如果中断次数过多,查看 /proc/interrupts分析中断类型;
通过 /proc/softirqs 与 /proc/interrupts 了解中断信息。
然后使用 pidstat -w -t 查看进程(及线程)的上下文切换情况,关注 自愿上下文切换(等待资源) 与 非自愿上下文切换(进程争抢) 数量。
=> 接下来要分析,资源使用在那些地方(分析应用的函数调用)
第三步、分析函数调用
使用 perf record -g 和 perf report -g 查看函数调用,找到占用资源最多的函数调用。
第四步、追查系统调用
使用 strace -f -p 追踪系统调用,查看进程的参数设置。
其他问题排查
使用率高,但是无法找到相关应用:程序运行时间短;程序在频繁的重启;
处理器的性能指标及检查工具

性能分析的工具选择
从性能指标出发,确定可用工具
load average => uptime / top
cpu utilization => vmstat / mpstat / top / sar / /proc/stat
process cpu utilzation => top / pidstat / ps / htop / atop
system context switch => vmstat
process context switch => pidstat
softirqs[……]

READ MORE

「Linux Kernel」- 常见问题记录

# NMI watchdog: BUG: soft lockup – CPU#2 stuck for 23s! [swapper]
NMI watchdog: BUG: soft lockup – CPU#2 stuck for 23s!
在虚拟机中显示如下错误:

Message from syslogd@k8s-master1 at Nov 1 17:55:07 …
kernel:watchdog: BUG: soft lockup – CPU#0 stuck for 21s! [ksoftirqd/0:9][……]

READ MORE

「Linux Performance」- 内存

内存性能指标

内存性能工具
free => 整体内存 / Swap
top / ps => 进程的内存使用情况
/proc => 内存使用指标的来源;找到使用 Swap 分区的进程
vmstat => 动态观察内存的变化情况,区分 cache 和 buffer、Swap In 和 Swap Out 的内存大小
sar => 动态观察 buffer 和 Swap 变化
/proc/zoneinfo => 观察内存变化,内存回收情况
cachestat => 查看整个系统缓存的读写命中情况
cachetop => 每个进程缓存的读写命中情况
memleak => 内存泄漏检查
性能指标和性能工具的联系
从内存指标出发
系统已用、可用、剩余内存:free vmstat sar /proc/meminfo 进程虚拟内存、常驻内存、共享内存:ps top 进程内存分布:pmap 进程Swap换出内存:top /proc/pid/status 进程缺页异常:ps top 系统换页情况:sar 缓存/缓冲区用量:free vmstat sar cachestat 缓存/缓冲区命中率:cachetop SWAP已用空间和剩余空间:free sar Swap换入换出:vmstat 内存泄漏检测:memleak valgrind 指定文件的缓存大小:pcstat
从性能工具出发
free /proc/meminfo 系统已用、可用、剩余内存以及缓存和缓冲区的使用量
top ps 进程虚拟、常驻、共享内存以及缺页异常
vmstat 系统剩余内存、缓存、缓冲区、换入、换出
sar 系统内存换页情况、内存使用率、缓存和缓冲区用量以及Swap使用情况
cachestat 系统缓存和缓冲区的命中率
cachetop 进程缓存和缓冲区的命中率
slabtop 系统Slab缓存使用情况
/proc/pid/status 进程Swap内存等
pmap /proc/pid/smaps 进程地址空间和内存状态
valgrind 进程内存错误检查器,用来检测内存初始化、泄漏、越界访问等各种内存错误
memleak 内存泄漏检测
pcstat 查看指定文件的缓存情况
如何迅速分析内存的性能瓶颈
虽然内存的性能指标很多,描述内存的原理,指标间自然不会完全孤立,一般都会有关联。反过来说,这些关联也正是源于系统的内存原理,所以基础原理的非常重要。
为了迅速定位内存问题,通常可以先运行几个覆盖面比较大的性能工具,比如 free、top、vm[……]

READ MORE

「Linux」- Hack the Virtual Memory

参考文献
Hack the Virtual Memory: malloc, the heap & the program break[……]

READ MORE

「Linux」- 内存泄漏(学习笔记)

问题描述
对应用程序来说,动态内存的分配和回收,是既核心又复杂的一个逻辑功能模块。
管理内存的过程中,也很容易发生各种各样的“事故”: 1)没正确回收分配后的内存,导致内存泄漏; 2)访问的是已分配内存边界外的地址,导致程序异常退出;
内存泄漏是如何产生的
用户空间内存包括多个不同的内存段,通常堆内存与内存映射段容易产生内存泄漏。内核空间我们不需要担心(当然可能存在内存泄漏),我们这里关注的重点是用户空间的应用程序产生的内存泄漏,已经如何处理。
只读段
包括程序的代码和常量,由于是只读的,不会再去分配新的内存,所以也不会产生内存泄漏。
数据段
包括全局变量和静态变量,这些变量在定义时就已经确定了大小,所以也不会产生内存泄漏。
栈内存(Stack)
在程序中定义局部变量,比如整数数组 int data[64],就定义了一个可以存储 64 个整数的内存段。由于这是一个局部变量,它会从内存空间的栈中分配内存。
栈内存由系统自动分配和管理,一旦程序运行超出了这个局部变量的作用域,栈内存就会被系统自动回收,所以不会产生内存泄漏的问题。
堆内存(Heap)
很多时候我们事先并不知道数据大小,所以要用标准库函数 malloc() 在程序中动态分配内存。这时候系统就会从内存空间的堆中分配内存。
堆内存由应用程序自己来分配和管理,如果应用程序没有正确释放堆内存,就会造成内存泄漏。 1)程序退出,系统自动释放内存 2)或者需要应用程序明确调用库函数 free() 来释放它们
内存映射段
包括动态链接库和共享内存
其中共享内存由程序动态分配和管理。所以如果程序在分配后忘了回收,就会导致跟堆内存类似的泄漏问题。
内存泄漏的危害
内存泄漏会带来系列问题: 1)应用程序自己不能访问:应用程序已经忘记自己申请的内存,导致内存被“占用但闲置”; 2)系统也不能把它们再次分配给其他应用:对应的物理内存被占用,导致无法再分配; 3)内存泄漏不断累积,甚至会耗尽系统内存;
虽然操作系统会通过 OOM – Out of Memory 会结束进程,但是在这之前依旧会带来其他问题: 1)其他需要内存的进程,可能无法分配新的内存; 2)内存不足,又会触发系统的缓存回收以及 SWAP 机制,从而导致 I/O 性能问题;
问题排查:检查内存泄漏(memleak)

# docker run –name=app-mem-leak -itd feisky/app:mem-leak
# docker logs app

// 如何定位内存泄漏问题
// 无法使用 top ps 等工具,但是可以使用 vmstat 查看内存增长情况

# vmstat
0 0[……]

READ MORE

「Linux」- 进程内存占用分析

问题描述
问题现象很简单,系统内存使用情况很高,如下命令输出所示:

# uptime
23:42:48 up 34 days, 13:21, 12 users, load average: 0.52, 0.75, 0.85

# free -h
total used free shared buff/cache available
Mem: 15Gi 12Gi 541Mi 1.1Gi 2.6Gi 1.7Gi
Swap: 29Gi 11Gi 18Gi

# top
top – 23:45:16 up 34 days, 13:24, 12 users, load average: 0.59, 0.68, 0.81
Tasks: 638 total, 2 running, 634 sleeping, 0 stopped, 2 zombie
%Cpu0 : 10.8 us, 3.3 sy, 0.0 ni, 83.0 id, 0.3 wa, 0.0 hi, 2.6 si, 0.0 st
%Cpu1 : 8.9 us, 4.0 sy, 0.0 ni, 85.5 id, 0.3 wa, 0.0 hi, 1.3 si, 0.0 st
%Cpu2 : 13.1 us, 2.9 sy, 0.0 ni, 82.7 id, 0.3 wa, 0.0 hi, 1.0 si, 0.0 st
%Cpu3 : 8.2 us, 3.6 sy, 0.0 ni, 87.3 id, 0.0 wa, 0.0 hi, 1.0 si, 0.0 st
MiB Mem : 15731.1 total, 529.8 free, 12563.0 used, 2638.3 buff/cache
MiB Swap: 30720.0 total, 19096.5 free, 11623.5 used. 1740.3 avail Mem

物理内存 16G 占用,SWAP 额外占用 11G 空间。这种问题通常重启便能解决:-),或者换个内存更大的笔记本(ThinkPad P15 P17 能够加到 128G 内存:-),但是草草地看看也没有找到我们喜欢的笔记本(电源太大、笔记本太重、不支持扩展钨、不支持 Intel RST RAID 技术),所以最后我们决定还是排查内存系统使用情况,分析各个进程的内存占用情况。从以往的经验看,不是 Chrome、Firfox 的问题,就是 GNOM[……]

READ MORE

「Linux Performance」- 网络性能指标

TCP 三次握手原理,你真的理解吗? 关于TCP 半连接队列和全连接队列
nslookup-OK-but-ping-fail
网络性能指标(Linux)
带宽,表示链路的最大传输速率,单位通常为 b/s (比特/秒) 通常带宽受物理网卡的限制,网卡确定后,带宽随即确定(当然,实际带宽会受限于整个网络链路中最小的那个模块)
吞吐量,表示单位时间内成功传输的数据量,单位通常为 b/s(比特/秒)或者 B/s(字节/秒) 吞吐量受带宽限制。“网络带宽测试”,这里测试的实际上不是带宽,而是网络吞吐量。网络使用率 = 吞吐量 / 带宽 Linux 服务器的网络吞吐量一般会比带宽小,而对交换机等专门的网络设备来说,吞吐量一般会接近带宽。
延时,表示从网络请求发出后,一直到收到远端响应,所需要的时间延迟 在不同场景中,延时可能会有不同含义。比如它可以表示,建立连接需要的时间(比如 TCP 握手延时),或一个数据包往返所需的时间(比如 RTT)。
PPS,是 Packet Per Second(包/秒)的缩写,表示以网络包为单位的传输速率 PPS 通常用来评估网络的转发能力,比如硬件交换机通常可以达到线性转发(即 PPS 可以达到或者接近理论最大值)。而基于 Linux 服务器的转发,则容易受网络包大小的影响。 对 TCP 或者 Web 服务来说,更多会用并发连接数和每秒请求数(QPS,Query per Second)等指标,它们更能反应实际应用程序的性能。
除了这些指标,网络的可用性(网络能否正常通信)、并发连接数(TCP 连接数量)、丢包率(丢包百分比)、重传率(重新传输的网络包比例)等也是常用的性能指标。
网络基准测试
在 Linux 中,不同协议层的行为显然不同。测试之前应该弄清楚被测协议所属的协议层: 1)基于 HTTP 或者 HTTPS 的 Web 应用程序,显然属于应用层,需要我们测试 HTTP/HTTPS 的性能 2)对大多数游戏服务器,需要我们测试 TCP/UDP 的性能 3)把 Linux 作为软交换机或路由器来用,我们更关注网络包的处理能力(即 PPS),重点关注网络层的转发性能
转发性能(网络接口层和网络层)
它们主要负责网络包的封装、寻址、路由以及发送和接收。在这两个网络协议层中,每秒可处理的网络包数(PPS)是最重要的性能指标。尤其是小包的处理能力。
我们这里使用 pktgen 是 Linux 内核自带的高性能网络测试工具。需要加载 pktgen 内核模块后,再通过 /proc 文件系统来交互:

# modprobe pktgen

# ps -ef | grep pktgen | grep -v grep
root 26384 2[……]

READ MORE

「Linux Networking」- C10K and C10M

C10K 和 C1000K 的首字母 C 是 Client 的缩写。C10K 就是单机同时处理 1 万个请求(并发连接 1 万)的问题,而 C1000K 也就是单机支持处理 100 万个请求(并发连接 100 万)的问题。
C10K
Dan Kegel,在 1999 年,32-bit OS,Linux 2.2,2GB,千兆网卡,怎么支持并发 1 万的请求?
从资源上来说,对 2GB RAM、千兆网卡的服务器来说,同时处理 10000 个请求,只要每个请求处理占用不到 200KB(2GB/10000) RAM 存和 100Kbit (1000Mbit/10000) Bandwidth 就可以。所以物理资源是足够的,接下来自然是软件的问题,特别是网络的 I/O 模型问题。
在 C10K 前,网络处理采用同步阻塞,即每个请求都分配一个进程或者线程。存在的问题就是,如果请求量增加,进程或线程的调度、上下文切换、占用内存,都会成为瓶颈。
这里就有两个问题需要解决: 1)怎样在一个线程内处理多个请求? 2)怎么更节省资源地处理客户请求?
I/O 模型优化
两种 I/O 事件通知的方式:

水平触发(Level Triggered):只要文件描述符可以非阻塞地执行 I/O,就会触发通知。也就是说,应用程序可以随时检查文件描述符的状态,然后再根据状态,进行 I/O 操作。

边缘触发(Edge Triggered):只有在文件描述符的状态发生改变(也就是 I/O 请求达到)时,才发送一次通知。这时候,应用程序需要尽可能多地执行 I/O,直到无法继续读写,才可以停止。如果 I/O 没执行完,或者因为某种原因没来得及处理,那么这次通知也就丢失了。

I/O 多路复用(I/O Multiplexing):

第一种,使用非阻塞 I/O 和水平触发通知,比如使用 select 或者 poll。
根据刚才水平触发的原理,select 和 poll 需要从文件描述符列表中,找出哪些可以执行 I/O ,然后进行真正的网络 I/O 读写。由于 I/O 是非阻塞的,一个线程中就可以同时监控一批套接字的文件描述符,这样就达到了单线程处理多请求的目的。

优点:对应用程序比较友好,它的 API 简单;

缺点:应用软件使用 select 和 poll 时,需要对这些文件描述符列表进行轮询,这样请求数多的时候就会比较耗时。并且 select 和 poll 还有一些其他的限制。

select 使用固定长度的位相量,表示文件描述符的集合,因此会有最大描述符数量的限制。比如,在 32 位系统[……]

READ MORE

「ddos」-

从攻击的原理上来看,DDoS 可以分为下面几种类型: 1)耗尽带宽。无论是服务器还是路由器、交换机等网络设备,带宽都有固定的上限。带宽耗尽后,就会发生网络拥堵,从而无法传输其他正常的网络报文 2)耗尽操作系统的资源。网络服务的正常运行,都需要一定的系统资源,像是 CPU、内存等物理资源,以及连接表等软件资源。一旦资源耗尽,系统就不能处理其他正常的网络连接 3)消耗应用程序的运行资源。应用程序的运行,通常还需要跟其他的资源或系统交互。如果应用程序一直忙于处理无效请求,也会导致正常请求的处理变慢,甚至得不到响应
模拟 DDOS 攻击

# docker run -itd –name=nginx –network=host nginx

// 测试当前访问速度

# curl -s -w ‘Http code: %{http_code}\nTotal time:%{time_total}s\n’ -o /dev/null http://192.168.0.30/

Http code: 200
Total time:0.002s

// 模拟 DDOS 攻击

# hping3 -S -p 80 -i u10 192.168.0.30

// -S 参数表示设置TCP协议的SYN(同步序列号),-p表示目的端口为80
// -i u10 表示每隔10微秒发送一个网络帧

// 测试当前访问速度

# curl -w ‘Http code: %{http_code}\nTotal time:%{time_total}s\n’ -o /dev/null –connect-timeout 10 http://192.168.0.30

Http code: 000
Total time:10.001s
curl: (28) Connection timed out after 10000 milliseconds

// –connect-timeout表示连接超时时间

观察网络流量

# sar -n DEV 1
08:55:49 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
08:55:50 docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
08:55:50 eth0 22274.00 629.00 1174.64 37.78 0.00 0.00 0.00 0.0[……]

READ MORE

「dns resolution」-

几种常见的 DNS 优化方法
1)对 DNS 解析的结果进行缓存 2)对 DNS 解析的结果进行预取 3)使用 HTTPDNS 取代常规的 DNS 解析 4)基于 DNS 的全局负载均衡(GSLB)
询该域名对应的网络地址
nslookup

# nslookup k4nz.com
Server: 172.31.253.23
Address: 172.31.253.23#53

Non-authoritative answer:
k4nz.com canonical name = world.host.d3rm.org.
Name: world.host.d3rm.org
Address: 45.78.20.157

172.31.253.23 并不是直接管理 time.geekbang.org 的域名服务器,所以查询结果是非权威的(Non-authoritative answer)
dig

# dig +trace +nodnssec k4nz.com // +trace表示开启跟踪查询 +nodnssec表示禁止DNS安全扩展

; <<>> DiG 9.11.5-P4-5.1+deb10u1-Debian <<>> +trace +nodnssec k4nz.com
;; global options: +cmd
. 19909 IN NS k.root-servers.net.
. 19909 IN NS a.root-servers.net.
. 19909 IN NS l.root-servers.net.
. 19909 IN NS i.root-servers.net.
. 19909 IN NS d.root-servers.net.
. 19909 IN NS e.root-servers.net.
. 19909 IN NS g.root-servers.net.
. 19909 IN NS h.root-servers.net.
.[……]

READ MORE

「Network」- 关于TCPDUMP和IPTABLES的先后顺序

问题背景
当 Host-A 无法访问 Host-B 时,我们可以在 Host-B 上使用tcpdump抓包,检查 Host-B 是否收到了数据包。
而 Host-B 上通常都配置了防火墙,那在 Host-B 上数据包是先被 tcpdump 捕获呢,还是先被 iptables 过滤调了?
实际情况
事实上它们的关系是这样子的:

Wire -> NIC -> tcpdump -> netfilter -> applications -> netfilter -> tcpdump -> NIC -> Wire

因此,使用tcpdump后,可以看到流入网卡的全部数据包,也可以看到流出网卡的所有数据包,但是不一定能看到应用程序返回的数据包。
详细说明
在Linux中,当「网络栈」中接收到「常规数据包」时,「内核」首先检查是否存在对「常规数据包」感兴趣的「数据包套接字」,如果有,则将「常规数据包」转发到该「数据包套接字」。如果使用了选项ETH_P_ALL,则所有协议都通过数据包套接字。
命令tcpdump基于libpcap库,而该库用于创建「数据包套接字」。libpcap使用ETH_P_ALL选项实现一个这样的「数据包套接字」,将「常规数据包」保留一个副本供自己分析使用,并将「常规数据包」复制回「网络栈」中,然后内核就可以以通常的方式处理它,这包括首先将它传递给netfilter(iptables的内核空间对应物)。同样的事情,在发送数据包的情况下,以相反的顺序发生(即,第一个netfilter,然后通过「数据包套接字」)。
所以在某些rootkit中,可以使用libpacp来绕过防火墙。
参考文献
Will tcpdump see packets that are being dropped by iptables? Does tcpdump bypass iptables? Iptables FORWARD chain traffic not seen by tcpdump Debugging iptables rules with tcpdump and wireshark[……]

READ MORE

「nat」- 性能问题排查

第一步、创建负载环境
性能正常的 Nginx 服务

# docker run –name nginx-hostnet –privileged –network=host -itd feisky/nginx:80

# curl http://10.10.50.199

# ulimit -n 65536
# ab -c 5000 -n 100000 -r -s 2 http://10.10.50.199/
// -c 表示并发请求数为5000,-n 表示总的请求数为10万
// -r 表示套接字接收错误时仍然继续执行,-s 表示设置每个请求的超时时间为 2s

Requests per second: 9531.80 [#/sec] (mean)
Time per request: 524.560 [ms] (mean)
Time per request: 0.105 [ms] (mean, across all concurrent requests)
Transfer rate: 7827.84 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 220 676.8 56 7350
Processing: 8 174 514.5 58 10205
Waiting: 1 171 511.4 57 10205
Total: 10 394 894.1 114 10272

// 每秒请求数(Requests per second)为 9531;
// 每个请求的平均延迟(Time per request)为 524ms;
// 建立连接的平均延迟(Connect)为 220ms。

运行端口映射的 Nginx 服务

# docker run –name nginx –privileged -p 8080:8080 -itd feisky/nginx:nat

// Nginx 启动后,可以执行 iptables 命令,确认 DNAT 规则已经创建:

# iptables -nL -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DOCKER all — 0.0.0.0/0 0.0.0.0/0 ADDRTYP[……]

READ MORE

「networking latency」-

其他原因导致的网络延迟: 1)网络传输慢,导致延迟; 2)Linux 内核协议栈报文处理慢,导致延迟; 3)应用程序数据处理慢,导致延迟等等。
网络延迟
1)这个时间可能是单向的,指从源地址发送到目的地址的单程时间; 2)也可能是双向的,即从源地址发送到目的地址,然后又从目的地址发回响应,这个往返全程所用的时间
通常,我们更常用的是双向的往返通信延迟,比如 ping 测试的结果,就是往返延时 RTT(Round-Trip Time)。
应用程序延迟
从应用程序接收到请求,再到发回响应,全程所用的时间。也指的是往返延迟,是网络数据传输时间 加上 数据处理时间 的和。
获取网络延迟
可以使用 ping traceroute hping3 来获取网络延迟:
hping3

# hping3 -c 3 -S -p 80 baidu.com
HPING baidu.com (eth0 123.125.115.110): S set, 40 headers + 0 data bytes
len=46 ip=123.125.115.110 ttl=51 id=47908 sport=80 flags=SA seq=0 win=8192 rtt=20.9 ms
len=46 ip=123.125.115.110 ttl=51 id=6788 sport=80 flags=SA seq=1 win=8192 rtt=20.9 ms
len=46 ip=123.125.115.110 ttl=51 id=37699 sport=80 flags=SA seq=2 win=8192 rtt=20.9 ms

— baidu.com hping statistic —
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 20.9/20.9/20.9 ms

// -c 表示发送3次请求,-S 表示设置 TCP SYN,-p 表示端口号为 80

// 从 hping3 的结果中,你可以看到,往返延迟 RTT 为 20.9ms

traceroute

# traceroute –tcp -p 80 -n baidu.com
traceroute to baidu.com (123.125.115.110), 30 hops max, 60 byte packets
1 * * *
2 * * *
3 * * *
4 * * *
5 * * *
6 * * *
7 * * *
8 * * *
9 * * *
10 * * *
11 * * *[……]

READ MORE

「tcpdump and wireshark」-

排查 ping 延迟
问题描述
执行 ping 测试:

// ping 3 次(默认每次发送间隔1秒)
// 假设DNS服务器还是上一期配置的 114.114.114.114

# ping -c3 geektime.org
PING geektime.org (35.190.27.188) 56(84) bytes of data.
64 bytes from 35.190.27.188 (35.190.27.188): icmp_seq=1 ttl=43 time=36.8 ms
64 bytes from 35.190.27.188 (35.190.27.188): icmp_seq=2 ttl=43 time=31.1 ms
64 bytes from 35.190.27.188 (35.190.27.188): icmp_seq=3 ttl=43 time=31.2 ms

— geektime.org ping statistics —
3 packets transmitted, 3 received, 0% packet loss, time 11049ms
rtt min/avg/max/mdev = 31.146/33.074/36.809/2.649 ms

在 ping 将要结束时,执行如下命令:

// 禁止接收从DNS服务器发送过来并包含googleusercontent的包

# iptables -I INPUT -p udp –sport 53 -m string –string googleusercontent –algo bm -j DROP

后三次 ping 请求都得到了响应,延迟(RTT)都是 30ms 左右。但是,汇总处三次发送和接受的总时间居然超过了 11s(11049ms)
问题原因
在三次 ping 请求中,用的都是 IP 地址,所以 DNS 解析应该没有问题。
再次执行 nsloopup 测试解析,发现能够解析,并且速度正常:

# time nslookup geektime.org
Server: 114.114.114.114
Address: 114.114.114.114#53

Non-authoritative answer:
Name: geektime.org
Address: 35.190.27.188

real 0m0.044s
user 0m0.006s
sys 0m0.003s

我们使用 tcpdump 抓包,查看网络数据包:

# tcpdump -nn udp port 53 or host 35.190.27.188
//[……]

READ MORE

「Web性能测试常用术语」

主题:介绍一些Web性能中常用术语,有些我也不是很懂,也是从网上和书中习得的。
本文的内容是集合网上博文、书籍外加个人的理解,小生不才,如有错误,望各位大牛不吝赐教。
并发和并行有什么区别?
做并发编程之前,必须首先理解什么是并发,什么是并行。http://www.vaikan.com/docs/Concurrency-is-not-Parallelism/#landing-slide
先面的这就话是关键:并发是指同时处理很多事情,而并行是指同时能完成很多事情。
并发(Concurrency)

同时执行多个任务,即同时做很多事情。将相互独立的执行过程综合到一起的编程技术。

《real world haskell》作者的解释:一个并发程序是指能同时执行通常不相关的各种任务。以一个游戏服务器为例子:它通常是有各种组件组成,每种组件都跟外部世界进行着复杂的信息交互。一个组件有可能要处理多个用户聊聊;另外一些可能要处理用户的输入,并把最新状态反馈给用户;其它的用来进行物理计算。这些都是并发处理。

并发程序并不需要多核处理器。

并行(Parallelism)

将一个任务拆分成多个部分同时执行,同时完成很多事情。同时执行(相关的)计算任务的编程技术。

《real world haskell》作者的解释:相比之下,并行程序是用来解决一个单一任务的。以一个试图预估某支股票价格在下一分钟波动情况的金融组件为例,如果想最快速度的知道标普500中哪只股票应该卖出还是买进,你不能一个一个的计算,而是将这些所有的股票同时计算。这是并行。

并发数、吞吐量的概念最初用来衡量网络设备的性能,后来推广到服务器及业务上评估系统的整体性能。
一、网络设备的并发数、吞吐量并发数(Concurrency):

并发数:并发连接数,指网络设备所能处理的最大会话数量。这里的会话数是指“请求->响应”一次会话。
吞吐量(Throughput):用户请求是由一个个数据包组成,网络设备(防火墙/路由器/交换机)对每个数据包的处理要耗费资源。吞吐量是指在不丢包的情况下单位时间内通过网络设备的数据包数量。
网络层面,并发数和吞吐量的关系: 并发数x包长度=吞吐量
参考:吞吐与并发关系可以看出,在网络层面考察吞吐量,除了并发数,还要考虑请求包的大小(长度)。用于度量网络设备时候,可以用byte/秒。

二、服务器及业务上的并发数、吞吐量用于指网站性能/服务器性能时候:
并发/并发用户:

并发分为两种情况:1.严格[……]

READ MORE

「QPS, TPS, PV…」

TODO ! QPS TPS PV
参考文献
PV、TPS、QPS是怎么计算出来的? 什么是TPS,什么是QPS,区别是什么?[……]

READ MORE

「CAD/CAM」- 计算机辅助设计(Computer Aided Design)

第一章 计算机辅助设计概述
第一节 什么是计算机辅助设计
计算机辅助设计就是利用计算机及其图形设备帮助设计人员完成图形图像的设计任务。现在,计算机辅助设计已在电子和电气、科学研究、机械设计、软件开发、机器人、服装业、出版业、工厂自动化、土木筑、地质、计算机艺术等各个领域得到广泛应用。   计算机辅助技术的产生和发展是基于计算机硬件、软件和图形学理论发展的。
第二节 图形和图像的基本概念
1、广泛意义上的图形 广泛的图形是计算机图形学研究的对象,指:能在人的视觉系统中产生视觉印象的客观对象,包括:自然景物、拍摄到的照片、用数学方法描述的图形等等。 构成图形的要素有:几何要素(刻画形状的点、线、面、体等);非几何要素(反映物体表面属性或材质的灰度、颜色等)。 表示图形的方法有:点阵法(枚举出图形中所有的点来表示图形,强调图形是由点及点的属性—-颜色构成),这种方法表示的图形我们称为像素图或图像;参数法(由图形的形状参数和属性参数来表示)这种方法表示的图形我们简称图形(有别于广泛意义的图形)。
2、图形和图像 我们以广泛意义图形的表示方法来分类。在计算机辅助设计中,所说的图形就是指经由计算机绘制出来的,包括形状参数(方程或分析表达式的系数,线段的端点坐标等)和属性参数(颜色、线型、材质等)表示的图。图像就是指由点阵法表示的图。 图形和图像两个概念间的区别主要是: 图像纯指计算机内以位图(Bitmap)形式存在的灰度信息 图形含有几何属性,或者说更强调场景的几何表示,是由场景的几何模型和景物的物理属性共同组成的。 但是随着计算机图形学的发展,两个概念的区别越来越小了。

3、位图与矢量图 我们在艺术设计专业中,常用的计算机图形的分类是矢量图形(简称矢量图)和位图图像(简称位图)。教材第32页。 矢量图就对应我们前述的图形,通过画贝赛尔曲线显现的图像,线和面整洁精湛,任意缩放不影响图像质量,用于字体、商标、漫画等的设计,有高品质的打印结果。 位图就对应我们前述的图像,由像素构成,所以非常适合表现照片、绘画等有深度的色调、柔和的质感以及自然的氛围但同时会在放大缩小图像时对图像的质量有所损害。
4、像素与分辨率 像素是组成位图图像最基本的元素,每个像素都包含位置信息和颜色信息,一个图像包含色像素越多,描述就越细腻,图像效果就更好,但是,文件也会增大。 分辨率是指单位长度内包含的像素点的数量,像素/英寸(ppi)。分辨率决定了位图细节的精细程度,分辨率越高,图像越清晰。 像素与分辨率的关系: 分辨率越高,像素点越小,密度更高,图像包含的像素点越多,图像质量越好,文件越大。反之亦然。 另一个常用概念是:DPI ,原是印刷上的记量单位,指每平方英寸上所印刷的网点数(Dot Per Inch)。但在电脑与印刷结合,数位输入[……]

READ MORE

「MIS」 – 管理信息系统(Management Information System)

问题描述
我们试图了解 MIS(管理信息系统)学科的学习内容以及该学科的研究方向。
解决方案
该笔记内容复制于 管理信息系统(办公设备)_百度百科 页面,详细内容请参照原文。
管理信息系统(Management Information System,简称 MIS)是一个以人为主导,利用计算机硬件)软件)网络通信设备以及其他办公设备,进行信息的收集)传输)加工)储存)更新)拓展和维护的系统。
管理信息系统(Management Information Systems简称MIS))是一个不断发展的新型学科,MIS的定义随着计算机技术和通讯技术的进步也在不断更新,在现阶段普遍认为管理信息系统MIS)是由人和计算机设备或其他信息处理手段)组成并用于管理信息的系统。
产生背景
20世纪,随着全球经济的蓬勃发展,众多经济学家纷纷提出了新的管理理论。20世纪50年代,西蒙提出管理依赖于信息和决策的思想。同时期的维纳发表了控制论,他认为管理是一个过程。1958年,盖尔写到:“管理将以较低的成本得到及时准确的信息,做到较好的控制。”这个时期,计算机开始用于会计工作,出现数据处理一词。
1970年,Walter T.Kennevan给刚刚出现的管理信息系统一词下了一个定义:“以口头或书面的形式,在合适的时间向经理)职员以及外界人员提供过去的)现在的)预测未来的有关企业内部及其环境的信息,以帮助他们进行决策。”在这个定义里强调了用信息支持决策,但并没有强调应用模型,没有提到计算机的应用。
1985年,管理信息系统的创始人,明尼苏达大学的管理学教授Gordon B.Davis给了管理信息系统一个较完整的定义,即“管理信息系统是一个利用计算机软硬件资源,手工作业,分析)计划)控制和决策模型以及数据库人-机系统。它能提供信息支持企业或组织的运行管理和决策功能。”这个定义全面地说明了管理信息系统的目标)功能和组成,而且反映了管理信息系统在当时达到的水平。
系统作用
1)管理信息是重要的资源:对企业来说,人)物资)能源)资金)信息是5大重要资源。人)物资)能源)资金这些都是可见的有形资源,而信息是一种无形的资源。以前人们比较看重有形的资源,进入信息社会和知识经济时代以后,信息资源就显得日益重要。因为信息资源决定了如何更有效地利用物资资源。信息资源是人类与自然的斗争中得出的知识结晶,掌握了信息资源,就可以更好地利用有形资源,使有形资源发挥更好的效益。
2)管理信息是决策的基础:决策是通过对客观情况)对客观外部情况)对企业外部情况)对企业内部情况的了解才能做出正确的判断和决策。所以,决策和信息有着非常密切的联系。过去一些凭经验或者拍脑袋的那种决策经常会造成决策的失误,越来越明确信息是决策性基础。
3)管理[……]

READ MORE

「软件资格考试」- RuanJianZiGeKaoShi

浙江省软件考试网 http://www.zjrjks.org/interIndex.do?method=list2&dir=/rjksw/ksjs/rkjs[……]

READ MORE

「Computer Architecture and Organization」- 计算机组成与结构

[……]

READ MORE

「Understanding Operating Systems」- 理解操作系统()

该部分笔记:侧重于操作系统原理,涉及较少操作,操作偏向于验证原理。
相关链接
Linux Storage Stack Diagram

章节列表
「系统启动」- RUNLEVEL 「DAY 03」- 「DAY 03」- 「DAY 03」- 「Linux Boot Process and Shutdown」- Kernel and Initramfs 「DAY 03」- 「GRUB」- 引导加载程序 「DAY 03」-[……]

READ MORE

「Operating System」- 概念、术语

[……]

READ MORE

「Linux」- 五类 I/O 模型(学习笔记)

在 UNIX Network Programming 中,给出五类 I/O 模型:

1)blocking IO ———– 阻塞 IO
2)nonblocking IO ——– 非阻塞 IO
3)IO multiplexing ——- IO 多路复用
4)signal driven IO —— 信号驱动 IO
5)asynchronous IO ——- 异步 IO

前面四种 IO 都可以归类为 Synchronous IO(同步IO)。
阻塞(BLOCKING I/O)
最容易理解的是阻塞。在一次网络 I/O 时,Client 发出请求,Server 收到。当 Client 发出请求,进行 I/O 时,就不能进行其他操作,需要同步的等待结果的返回。
用户进程 Process 在 Blocking IO 读 recvfrom 操作的两个阶段都是等待的。在数据没准备好的时候,Process 原地等待 kernel 准备数据。kernel 准备好数据后,Process 继续等待kernel 将数据复制到自己的 buffer。在 Kernel 完成数据复制后,Process 才会从 recvfrom 系统调用中返回,然后继续执行其他操作。
非阻塞(NONBLOCKING I/O)
process 在 NonBlocking IO 读 recvfrom 操作的第一个阶段是不会 block 等待的,如果 kernel 数据还没准备好,那么 recvfrom 会立刻返回 EWOULDBLOCK 错误。当 kernel 准备好数据后,进入处理的第二阶段的时候,process会等待 kernel 将数据 copy 到自己的 buffer,在 kernel 完成数据的 copy 后 process 才会从 recvfrom 系统调用中返回。
I/O 多路复用(I/O MULTIPLEXING)
当使用 I/O 多路复用时,有多个 Client 同时发送请求,这些 I/O 操作会被 selector(epoll,kqueue) 给暂时挂起,放入内存队列。此时 Server 可以自己选择什么时候读取、处理这些 I/O,也就是说 Server 可以同时持有多个 I/O。
但是 I/O 多路复用,在没有用特殊异步 API 的情况下,还是同步的操作。
在 IO 多路复用的时候,process 在两个处理阶段都是 block 住等待的。初看好像 IO 多路复用没什么用,其实 select、poll、epoll 的优势在于可以以较少的代价来同时监听处理多个IO。
事件驱动(SIGNAL DRIVEN I/[……]

READ MORE

「Operating System」- 程序是如何执行的

相关连接
Why do executables depend on the OS but not on the CPU? How does OS execute compiled binary files?[……]

READ MORE

「ELF」- Executable and Linkable Format

参考文献
Wikipedia/Executable and Linkable Format[……]

READ MORE

「Object file」

参考文献
Wikipedia/Object file[……]

READ MORE

「Writing a Simple Operating System」

笔记内容
该部分笔记是在学习 Linux 性能优化 的过程中产生的。
该部分笔记,为了记录如何编写一个“简单的操作系统”。与现代操作系统相比,这个“简单的操作系统”有多简单呢,就好比积木与高楼大厦的对比。但是,通过该项目能让我们对操作系统有个基本认识,属于操作系统入门学习实践。
知识储备要求
汇编语言以及硬件知识
书籍:《汇编语言(第 3 版)》、《x86 汇编语言 从实模式到保护模式》、《32 位汇编语言程序设计(第 2 版)》
熟读并理解以上书中内容:能够理解硬件的基本工作原理;能够使用汇编语言进行开发;
编译调试工具
能够使用 Bochs 进行调试;能够使用 VirtualBox 或者其他虚拟机软件
相关链接
Welcome to OSDev.org OSDev.org/Books
GitHub/cfenollosa/os-tutorial Writing a Simple Operating System — from Scratch
《30天自制操作系统》作者网站:“http://hrb.osask.jp/”(真多年了,居然还能访问)[……]

READ MORE

「DAY 00」- 着手开发之前

[……]

READ MORE