Linux 常用命令:从资源限制到网络传输
一、前导:概述
本系列主要讲解Linux运行时命令,包括网络、磁盘、内存、CPU相关参数等,主要是为了分享怎么通过常见的 Linux 命令去排查相关问题。比如:
- 发现机器的CPU负荷比较高,那么怎么查到是哪个进程CPU占用率比较高?
- 磁盘IO的写入很频繁,怎么查到是哪个进程或线程对磁盘IO频繁的操作?
等等。
本系列就是分享诸如这类问题的排查技巧。注意,本系列的核心方向不是去讲解Linux的命令查找、显示当前目录等(比如ls、cat等)基础命令操作。本系列的重点分享内容包括:
- Linux基础命令和工具。
- CPU性能监控。
- 内存性能监控。
- 文件IO性能监控。
- 网络IO性能监控。
强烈推荐:Linux 大牛,Netflix 高级性能架构师 Brendan Gregg的博客http://www.brendangregg.com。《性能之巅》书籍就是他出版的,主要分为:CPU、内存、磁盘、网络四大块。
在 Linux 系统中,命令行工具是不可或缺的利器,它们能帮助我们更高效地管理系统、进行开发测试、传输文件,甚至解决跨平台兼容性问题。本文将介绍几个常用的 Linux 命令行工具,包括 ulimit、uptime、curl、scp、dos2unix 和 unix2dos。 掌握这些命令,将使你对 Linux 系统的掌控力更上一层楼。 让我们一起开启探索之旅吧!
二、ulimit 用户资源
ulimit
是一个用于控制系统资源使用限制的命令,在 Linux 和类 Unix 操作系统中非常常见。ulimit
主要用于设置或显示用户进程可用的系统资源限制。这些限制可以帮助防止单个用户或进程消耗过多系统资源,从而影响系统的整体性能和稳定性。
常用 ulimit
选项:
-
查看当前限制
ulimit -a
-
设置资源限制
ulimit -<type> <value>
其中
<type>
表示想要设置的资源类型,<value>
是新的限制值。常见的资源类型包括:-c
: 设置核心转储文件的大小(以字节为单位)-d
: 设置数据段的大小(以字节为单位)-f
: 设置文件的最大大小(以字节为单位)-l
: 设置最大可以锁定在内存中的地址空间大小(以字节为单位)-m
: 设置最大可用内存大小(以字节为单位)-n
: 设置最大打开文件数-s
: 设置栈大小(以字节为单位)-t
: 设置最大进程运行时间(以秒为单位)-u
: 设置每个用户进程的最大进程数-v
: 设置最大虚拟内存大小(以字节为单位)-x
: 设置最大锁定内存的数量(以字节为单位)
例如,要将最大文件大小限制设置为 100 MB:
ulimit -f 102400
-
设置软限制和硬限制
- 软限制:是当前使用的限制值,可以被用户临时修改。
- 硬限制:是系统允许设置的最大限制值,只有超级用户(root)可以修改。
查看软限制和硬限制:
ulimit -H -<type> # 查看硬限制 ulimit -S -<type> # 查看软限制
修改软限制(例如,设置最大打开文件数为 2048):
ulimit -S -n 2048
修改硬限制(例如,设置最大打开文件数的硬限制为 4096,通常需要 root 权限):
ulimit -H -n 4096
Linux系统对每个登录的用户都限制其最大进程数和打开的最大文件句柄数。为了提高性能,可以根据硬件资源的具体情况设置各个用户的最大进程数和打开的最大文件句柄数。可以用ulimit -a
来显示当前的各种系统对用户使用资源的限制:
$ ulimit -a
real-time non-blocking time (microseconds, -R) unlimited
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 15397
max locked memory (kbytes, -l) 65536
max memory size (kbytes, -m) unlimited
open files (-n) 1048576
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 15397
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
这个命令在实现百万并发连接的时候会用到,用于设置文件句柄的参数。
# 设置用户的最大进程数:
ulimit -u 1024
# 设置用户可以打开的最大文件句柄数:
ulimit -n 65530
三、uptime 机器启动时间+负载
uptime
命令查看机器从上次启动以来的启动时间、登录用户、平均负载等情况,通常用于在线上应急或者技术攻关中,确定操作系统的重启时间。
uptime
命令用法: 直接运行 uptime
命令。
uptime
输出示例:
14:55:30 up 5 days, 2:34, 2 users, load average: 0.05, 0.02, 0.01
这个输出包含了以下几个部分:
- 当前时间(14:55:30):系统当前的时间。
- 系统运行时间(up 5 days, 2:34):系统已经运行的时间,这里表示系统已运行了5天2小时34分钟。
- 当前登录用户数(2 users):当前有多少用户登录到系统。
- 负载平均值(load average: 0.05, 0.02, 0.01):系统在过去1分钟、5分钟和15分钟内的负载平均值。负载平均值是一个表示系统处理请求的压力指标,数值越高表示系统负载越重。
负载平均值详解:
- 负载平均值是指系统队列中的进程数。这些进程要么正在运行,要么正在等待 CPU 时间。
- 如果负载平均值与 CPU 核心数接近,通常表示系统在合理负载范围内。如果负载平均值远高于 CPU 核心数,则说明系统可能过载,可能需要优化或增加资源。
系统的平均负载是指在特定的时间间隔内队列中运行的平均进程数。如果一个进程满足以条件,它就会位于运行队列中。
- 它没有在等待I/O操作的结果。
- 它没有主动进入等待状态(也就是没有调用
wait
相关的系统API ) - 没有被停止(例如:等待终止)。
如果每个CPU内核的当前活动进程数不大于3的话,那么系统的性能还算可以支持。如果每个CPU内核的任务数大于5,那么这台机器的性能有严重问题。如果你的linux主机是1个双核CPU的话,当Load Average 为6的时候说明机器已经被充分使用了。
负载说明(现针对单核情况,不是单核时则乘以核数):
load<1
:没有等待。load==1
:系统已无额外的资源跑更多的进程了。load>1
:进程都堵着等待资源。
注意:
load < 0.7
时:系统很闲,要考虑多部署一些服务。0.7 < load < 1
时:系统状态不错。load == 1
时:系统马上要处理不多来了,赶紧找一下原因。load > 5
时:系统已经非常繁忙了。
不同load值说明的问题:
- 1分钟
load >5
,5分钟load < 3
,15分钟load <1
:短期内繁忙,中长期空闲,初步判断是一个抖动或者是拥塞前兆。 - 1分钟
load >5
,5分钟load >3
,15分钟load <1
:短期内繁忙,中期内紧张,很可能是一个拥塞的开始。 - 1分钟
load >5
,5分钟load >5
,15分钟load >5
:短中长期都繁忙,系统正在拥塞。 - 1分钟
load <1
,5分钟load>3
,15分钟load >5
:短期内空闲,中长期繁忙,不用紧张,系统拥塞正在好转。
补充:
- 查看cpu信息:
cat /proc/cpuinfo
。 - 直接获取cpu核数:
grep 'model name' /proc/cpuinfo | wc -l
。
uptime
命令可以与 top
或 htop
命令结合使用,提供更详细的系统资源使用情况和进程列表。比如在监控系统性能时,可以同时使用这些工具来获取系统的实时状态和负载情况。
四、curl 命令
curl
是一个常用的命令行工具,用于向服务器发送和接收数据。它支持多种协议,如 HTTP、HTTPS、 FTP、SFTP、SMTP 等。curl
的功能非常强大,适用于从网页下载数据、与 REST API 交互、测试服务器响应等场景。
基本用法:发送一个简单的 GET 请求并获取网页内容。
curl http://www.sina.com
下面是 curl
命令常用参数的表格汇总:
参数 | 说明 | 示例使用 |
---|---|---|
-X | 指定请求方法 | curl -X POST http://example.com/resource -d "key=value" |
-d | 发送 POST 请求时传递的数据 | curl -d "key=value" http://example.com/resource |
-F | 发送文件或表单数据 | curl -F "file=@path/to/local/file" http://example.com/upload |
-O | 下载文件并将其保存为原文件名 | curl -O http://example.com/file.zip |
-o | 下载文件并指定保存的文件名 | curl -o myfile.zip http://example.com/file.zip |
-I | 仅显示响应头 | curl -I http://example.com |
-i | 显示请求和响应头 | curl -i http://example.com |
-H | 添加自定义请求头 | curl -H "Authorization: Bearer YOUR_TOKEN" http://example.com/secure |
-v | 显示详细的请求和响应信息,便于调试 | curl -v http://example.com |
-k | 忽略 SSL 证书验证 | curl -k https://example.com |
--cert | 指定客户端证书 | curl --cert client.crt --key client.key https://example.com |
--key | 指定客户端证书的私钥 | curl --cert client.crt --key client.key https://example.com |
-L | 跟随 HTTP 重定向 | curl -L http://example.com/redirect |
--limit-rate | 限制下载速度 | curl --limit-rate 100k http://example.com/largefile.zip |
-u | 指定用户名和密码进行基本认证 | curl -u username:password http://example.com |
-T | 上传文件 | curl -T localfile.zip http://example.com/upload |
-e | 设置 Referer 请求头 | curl -e http://referer.com http://example.com |
--proxy | 使用指定的代理服务器 | curl --proxy http://proxyserver:port http://example.com |
-A | 设置用户代理(User-Agent) | curl -A "Mozilla/5.0" http://example.com |
-G | 发送 GET 请求时附加查询参数 | curl -G -d "key=value" http://example.com/resource |
-s | 静默模式,不显示进度条和错误信息 | curl -s http://example.com |
--data-urlencode | 对数据进行 URL 编码 | curl --data-urlencode "key=value" http://example.com |
-w | 在输出中写入自定义格式的文本 | curl -w "%{http_code}" -o /dev/null -s http://example.com |
由于当前的线上服务较多地使用了RESTful风格的API,所以集成测试就需要进行HTTP调用,查看返回的结果是否符合预期,curl
命令当然是首选的测试方法。
使用方式:
curl -i "http://www.sina.com" # 打印请求响应头信息
curl -I "http://www.sina.com" # 仅返回http头
curl -v "http://www.sina.com" # 打印更多的调试信息
curl -verbose "http://www.sina.com" # 打印更多的调试信息
curl -d 'abc=def' "http://www.sina.com" # 使用post方法提交http请求
curl -sw '%{http_code}' "http://www.sina.com" # 打印http响应码
五、scp 远程拷贝
scp
是 secure copy 的缩写,scp
是linux系统下基于ssh
登陆进行安全的远程文件拷贝命令,是一种用于在 Linux 和 Unix 系统之间进行安全文件传输的命令行工具。它基于 SSH 协议,因此在传输文件时提供了加密和安全性。scp
允许用户从远程主机下载文件到本地,或将本地文件上传到远程主机。
scp
命令的常用参数表格:
参数 | 说明 | 示例使用 |
---|---|---|
-r | 递归复制整个目录 | scp -r /path/to/local/directory username@remote_host:/path/to/remote/destination |
-P | 指定连接远程主机的端口(注意是大写的 -P ) | scp -P 2222 /path/to/local/file username@remote_host:/path/to/remote/destination |
-p | 保持文件的修改时间、访问时间和权限 | scp -p /path/to/local/file username@remote_host:/path/to/remote/destination |
-q | 安静模式,不显示传输进度 | scp -q /path/to/local/file username@remote_host:/path/to/remote/destination |
-C | 启用压缩以加速传输 | scp -C /path/to/local/file username@remote_host:/path/to/remote/destination |
-o | 传递额外的 SSH 选项 | scp -o "StrictHostKeyChecking=no" /path/to/local/file username@remote_host:/path/to/remote/destination |
-i | 指定私钥文件进行认证 | scp -i ~/.ssh/private_key /path/to/local/file username@remote_host:/path/to/remote/destination |
-v | 显示详细的调试信息 | scp -v /path/to/local/file username@remote_host:/path/to/remote/destination |
scp
命令是Linux系统中功能强大的文件传输命令,可以实现从本地到远程,以及从远程到本地的双向文件传输,用起来非常方便,常用来在线上定位问题时将线卜的一些文件下载到本地进行详查,或者将本地的修改上传到服务器上。
前提:
sudo apt-get install openssh-server
使用示例:
scp Lion@122.152.222.180:/home/Lion/test.txt . #下载122.152.222.180的文件
scp mi9.aac Lion@122.152.222.180:/home/Lion/ #上传文件到122.152.222.180
#下载test整个目录到本地
scp -r Lion@122.152.222.180:/home/Lion/test .
#上传本地test整个目录到122.152.222.180
scp -r test Lion@122.152.222.180:/home/Lion/
六、dos2unix和unix2dos命令
dos2unix
和 unix2dos
是两个用于处理文本文件格式转换的命令行工具,主要用于在不同操作系统之间转换文本文件的换行符格式。这在跨平台开发中尤其有用,例如将 Windows 系统上的文本文件转换为 Unix/Linux 系统上的格式,或者反之。通常在Windows系统开发的脚本和配置,UNIX系统下都需要转换。
dos2unix: 功能是将 Windows 风格的换行符(CRLF,即 \r\n
)转换为 Unix 风格的换行符(LF,即 \n
)。用于将从 Windows 系统生成的文本文件转换为 Unix/Linux 系统可接受的格式。
dos2unix filename
unix2dos :功能是将 Unix 风格的换行符(LF,即 \n
)转换为 Windows 风格的换行符(CRLF,即 \r\n
)。用于将 Unix/Linux 系统上的文本文件转换为 Windows 系统可接受的格式。
unix2dos filename
dos2unix
和 unix2dos
命令的常用参数:
命令 | 参数 | 说明 | 示例使用 |
---|---|---|---|
dos2unix | -c | 指定转换的文件格式(可以是 ascii 、unix 、mac 、windows ) | dos2unix -c=mac filename |
dos2unix | -o | 仅处理文件,不显示任何输出 | dos2unix -o filename |
dos2unix | -q | 静默模式,不显示错误信息 | dos2unix -q filename |
unix2dos | -c | 指定转换的文件格式(可以是 ascii 、unix 、mac 、windows ) | unix2dos -c=mac filename |
unix2dos | -o | 仅处理文件,不显示任何输出 | unix2dos -o filename |
unix2dos | -q | 静默模式,不显示错误信息 | unix2dos -q filename |
常用参数是-c
用于指定文件格式,-o
和 -q
用于控制输出行为。这两个工具对于确保文本文件在不同操作系统之间的兼容性是非常有用的,特别是在开发和文件传输的场景中。
转换整个目录:
find . -type f -exec dos2unix {} \;
# find ./ -type f 此命令是显示当前目录下所有的文件
七、总结
本文主要介绍了几个常用的 Linux 命令行工具,包括 ulimit
、uptime
、curl
、scp
、dos2unix
和 unix2dos
。 这些命令在系统管理、开发测试、文件传输和跨平台兼容性方面都发挥着重要作用。
ulimit
命令:用于控制系统资源使用限制,可以有效防止单个用户或进程消耗过多资源,保护系统稳定性。uptime
命令:用于查看系统运行时间和负载情况,帮助评估系统性能,并及时发现系统是否存在过载问题。curl
命令:用于向服务器发送和接收数据,可以用来测试 API、下载数据、与 RESTful API 交互等。scp
命令:用于在 Linux 和 Unix 系统之间进行安全文件传输,可以实现从本地到远程,以及从远程到本地的双向文件传输。dos2unix
和unix2dos
命令:用于处理文本文件格式转换,可以将 Windows 风格的换行符转换为 Unix 风格的换行符,反之亦然,确保文本文件在不同操作系统之间的兼容性。