linux学习笔记2 逻辑CPU
我们的前辈已经帮我们总结了一个基础的值(最终还是要看运行情况自行调整)
1、CPU密集型:操作内存处理的业务,一般线程数设置为:CPU核数 + 1 或者 CPU核数*2。核数为4的话,一般设置 5 或 8
2、IO密集型:文件操作,网络操作,数据库操作,一般线程设置为:cpu核数 / (1-0.9),核数为4的话,一般设置 40
查询分区的格式: blkid
格式化分区:mkfs -t xfs /dev/vdb
打包镜像:docker save xxxx | gzip > xxx.tar.gz
磁盘被手动挂载之后都必须把挂载信息写入/etc/fstab这个文件中,否则下次开机启动时仍然需要重新挂载
查看用户pungki的进程:ps -u pungki
定时执行命令:watch -n 1 'ps afx'
==================内存
VIRT:虚拟内存、RES:物理内存、SHR:共享内存。一般我们看进程占用了多少内存,就是看物理内存
pmap -x pid :这个命令用于查看进程的内存映像信息,能够查看进程在哪些地方用了多少内存。
=================IO
IO 和 存储密切相关,存储可以概括为磁盘,内存,缓存,三者读写的性能差距非常大,磁盘读写是毫秒级的(一般 0.1-10ms),内存读写是微妙级的(一般 0.1-10us),cache 是纳秒级的(一般 1-10ns)。但这也是牺牲其他特性为代价的,速度快的,价格越贵,容量也越小。
IO 性能这块,我们更多关注的是读写磁盘的性能
iostat 是专业分析 IO 性能的工具,可以方便查看 CPU、网卡、tty 设备、磁盘、CD-ROM 等等设备的信息
1)iostat -c 查看部分 CPU 使用情况:
一般会重点关注 %iowait 和 %idle
如果 %iowait 较高,则表明磁盘存在 IO 瓶颈,如果 %idle 较高,则 CPU 比较空闲,如果两个值都比较高,则有可能 CPU 在等待分配内存,瓶颈在内存,此时应该加大内存,如果 %idle 较低,则此时瓶颈在 CPU,应该增加 CPU 资源。
2)iostat -d 查看磁盘使用情况,主要是显示 IOPS 和吞吐量信息(-k : 以 KB 为单位显示,-m:以 M 为单位显示):
其中,几个参数分别解释如下:
-
tps:设备每秒的传输次数(transfers per second),也就是读写次数。
-
kB_read/s 和 kB_wrtn/s:每秒读写磁盘的数据量。
-
kB_read 和 kB_wrtn:读取磁盘的数据总量。
3)iostat -x 查看磁盘详细信息
iotop
这个命令类似 top,可以显示每个进程的 IO 情况,有了这个命令,就可以定位具体哪个进程的 IO 开销比较大了。
【总结:fdisk -l 和 df 查看磁盘基本信息,iostat -d 查看磁盘 IOPS 和吞吐量,iostat -x 结合 vmstat 查看磁盘的繁忙程度和处理效率。】
=============网络
1)ifconfig 显示网络接口配置信息
其中,RX/TX packets 是对接收/发送数据包的情况统计,包括错误的包,丢掉多少包等。RX/TX bytes 是接收/发送数据字节数统计。
性能调优时可以重点关注 MTU(最大传输单元) 和 txqueuelen(发送队列长度),比如可以用下面的命令来对这两个参数进行微调:
ifconfig eth0 txqueuelen 2000 ifconfig eth0 mtu 1500
2)网络接口地址配置
ifconfig 还常用来配置网口的地址,比如:
为网卡配置和删除 IPv6 地址:
ifconfig eth0 add 33ffe:3240:800:1005::2/64 #为网卡eth0配置IPv6地址
ifconfig eth0 del 33ffe:3240:800:1005::2/64 #为网卡eth0删除IPv6地址
修改MAC地址:
ifconfig eth0 hw ether 00:AA:BB:CC:dd:EE
配置IP地址:
ifconfig eth0 192.168.2.10
ifconfig eth0 192.168.2.10 netmask 255.255.255.0
ifconfig eth0 192.168.2.10 netmask 255.255.255.0 broadcast 192.168.2.255
=================
process id是逻辑cpu的id physical id是物理cpu的id cpu cores是每个cpu的核数 因此 cat /proc/cpuinfo | grep "physical id" | uniq | wc -l #可以看出物理cpu的总个数。 cat /proc/cpuinfo | grep "cpu core" | uniq #可以看出每个cpu的核数。 cat /proc/cpuinfo | grep "processor" | wc -l #可以看出逻辑cpu的个数。 #top ,然后1 ,也能看到逻辑cpu个数。
如果top中的load average如果机器长期处于高于核数的情况,说明机器 CPU 消耗严重了。
系统版本: cat /etc/redhat-release 或 lsb_release -a 或 cat /etc/issue
Linux内核版本 cat /proc/version 或 uname -a
在当前目录下找到txt文件,将里面的内容全部改成1111
find . -name '*.txt' -exec bash -c "echo '1111' >{}" \;
find . -type f -exec sh -c "cat {} ; echo '' " \;
查找DQ目录下的record.txt
find . -path '*/DQ*/record.txt'
修改record.txt的值
find . -path '*/DQ*/record.txt' -exec bash -c "echo '20181107_0000_DQ.PVD' >{}" \;
逐个打印
for i in `find . -path '*/CDQ/*' -name record_sub.txt` ; do cat $i ; done
===============
一般来说,linux服务器大多是通过ssh客户端来进行远程的登陆和管理的,使用ssh登陆linux主机以后,如何能够快速的和本地机器进行文件的交互呢,也就是上传和下载文件到服务器和本地;
与ssh有关的两个命令可以提供很方便的操作:
sz:将选定的文件发送(send)到本地机器
rz:运行该命令会弹出一个文件选择窗口,从本地选择文件上传到服务器(receive)
rz,sz是便是Linux/Unix同Windows进行ZModem文件传输的命令行工具
==================
什么是守护进程?
守护进程(Daemon Process),也就是通常说的 Daemon 进程(精灵进程),是 Linux 中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。
守护进程是个特殊的孤儿进程,这种进程脱离终端,为什么要脱离终端呢?之所以脱离于终端是为了避免进程被任何终端所产生的信息所打断,其在执行过程中的信息也不在任何终端上显示。由于在 linux 中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端就称为这些进程的控制终端,当控制终端被关闭时,相应的进程都会自动关闭。
==========================
-l:当前目录下所有文件的详细信息
-r:反向排序,倒序
-t:按修改时间排序
例子:ls -lrt :按修改时间反向的排序
=================
profile(/etc/profile)
,用于设置系统级的环境变量和启动程序,在这个文件下配置会对所有用户生效。当用户登录(login)时,文件会被执行,并从/etc/profile.d
目录的配置文件中查找 shell 设置
bash_profile 只对单一用户有效,文件存储于~/.bash_profile
,该文件是一个用户级的设置,可以理解为某一个用户的 profile 目录下。这个文件同样也可以用于配置环境变量和启动程序,但只针对单个用户有效。
使用source命令是配置立即生效:source ~./bash_profile
===============
文件描述符指向:普通文件,IO设备( stdin、stdout以及stderr),socket
文件描述符包括:sys.stdin、或open和popen方法得到的对象、或socket返回的socket对象
查看系统允许进程打开的文件描述符个数:cat /proc/sys/fs/file-max
============参考:https://mp.weixin.qq.com/s/_E01j5qhAj8rZd2GkJKwUQ
Nmap 是端口扫描的首选工具。除端口扫描外,Nmap 还可以检测 Mac 地址、操作系统类型、内核版本等
sudo nmap -sT -p- 10.10.8.8
-sT 选项告诉 Nmap 扫描 TCP 端口, -p- 扫描所有端口(65535 个)。如果不使用 -p-,Nmap 将仅扫描 1000 个端口
要扫描 UDP 端口,请使用 -sU 代替 -sT:
sudo nmap -sU -p- 10.10.8.8
====Netcat(或nc)========
扫描TCP端口范围:nc -z -v 10.10.8.8 20-80
扫描UDP端口范围:nc -z -v -u 10.10.8.8 20-80 2>&1 | grep succeeded
示例如下:
nc -z -v localhost 50070-50090 2>&1 | grep succeeded
-z 选项指示 nc 仅扫描打开的端口,而不发送任何数据,并且 -v 用于获取更多详细信息。
Connection to localhost 50071 port [tcp/*] succeeded!
Connection to localhost 50072 port [tcp/*] succeeded!
Connection to localhost 50073 port [tcp/*] succeeded!
Connection to localhost 50075 port [tcp/*] succeeded!
Connection to localhost 50076 port [tcp/*] succeeded!
Connection to localhost 50079 port [tcp/*] succeeded!
Connection to localhost 50080 port [tcp/*] succeeded!
Connection to localhost 50083 port [tcp/*] succeeded!
Connection to localhost 50086 port [tcp/*] succeeded!
Connection to localhost 50090 port [tcp/*] succeeded!
常用的选项包括以下几种: -l:以服务端的方式运行,监听指定的端口。默认是以客户端的方式运行。 -k:重复接受并处理某个端口上的所有连接,必须与 -l 一起使用。 -n:使用 IP 地址表示主机,而不是主机名,使用数字表示端口号,而不是服务名称。 -p:当以客户端运行时,指定端口号。 -s:设置本地主机发出的数据包的 IP 地址。 -C:将 CR 和 LF 两个字符作为结束符。 -U:使用 UNIX 本地域套接字通信。 -u:使用 UDP 协议通信,默认使用的是 TCP 协议。 -w:如果 nc 客户端在指定的时间内未检测到任何输入,则退出。 -X:当 nc 客户端与代理服务器通信时,该选项指定它们之间的通信协议,目前支持的代理协议包括 “4”(SOCKS v.4),“5”(SOCKS v.5)和 “connect” (HTTPs Proxy),默认使用 SOCKS v.5。 -x:指定目标代理服务器的 IP 地址和端口号。
首先,启动服务端,用 nc -l 0.0.0.0 12345 监听端口 12345 上的所有连接。
然后,启动客户端,用 nc -p 1234 127.0.0.1 12345 使用 1234 端口连接服务器 127.0.0.1::12345。接着就可以在两端互发数据了。
==============
tcpdump,强大的网络抓包工具。虽然有 wireshark 这样更易使用的图形化抓包工具,但 tcpdump 仍然是网络排错的必备利器
1)捕获某主机的数据包
比如想要捕获主机 200.200.200.100 上所有收到和发出的所有数据包,使用:
tcpdump host 200.200.200.100
2)捕获多个主机的数据包
比如要捕获主机 200.200.200.1 和主机 200.200.200.2 或 200.200.200.3 的通信,使用:
tcpdump host 200.200.200.1 and \(200.200.200.2 or \)
同样要捕获主机 200.200.200.1 除了和主机 200.200.200.2 之外所有主机通信的 IP 包。使用:
tcpdump ip host 200.200.200.1 and ! 200.200.200.2
3)捕获某主机接收或发出的某种协议类型的包
比如要捕获主机 200.200.200.1 接收或发出的 Telnet 包,使用:
tcpdump tcp port 23 host 200.200.200.1
4)捕获某端口相关的数据包
比如捕获在端口 6666 上通过的包,使用:
tcpdump port 6666
5)捕获某网口的数据包
比如捕获在网口 eth0 上通过的包,使用:
tcpdump -i eth0
下面还是举个例子,抓取 TCP 三次握手的包:
首先,用 nc 启动一个服务端,监听端口 12345 上客户端的连接:
nc -v -l 0.0.0.0 12345
接着,启动 tcpdump 监听端口 12345 上通过的包:
tcpdump -i any 'port 12345' -XX -nn -vv -S
然后,再用 nc 启动客户端,连接服务端:
nc -v 127.0.0.1 12345
最后,我们看到 tcpdump 抓到包如下: