尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Linux服务器性能调优实战:从监控分析到CPU、内存、I/O、网络优化

Linux服务器性能调优实战:从监控分析到CPU、内存、I/O、网络优化 1. 从“能用”到“好用”为什么你的Linux服务器需要调优最近在帮一个朋友排查他们线上服务的性能问题那台服务器配置不低但一到业务高峰期CPU使用率就飙升响应时间慢得让人抓狂。登录上去一看top命令显示负载平均值Load Average长期在10以上而CPU空闲率idle却还有30%多。这看起来有点矛盾对吧深入一看vmstat和iostat的输出里waI/O等待的百分比高得吓人磁盘的util利用率几乎一直是100%。问题很明显了瓶颈在磁盘I/O上。我们调整了文件系统挂载参数优化了应用日志的写入策略并启用了更高效的I/O调度器几个简单的操作后负载直接降到了2以下服务响应立刻顺畅了。这个经历让我再次确信Linux系统调优绝不是“玄学”而是从“服务器能用”到“业务跑得又快又稳”的关键一步。很多人觉得Linux装好就能用调优是高手才做的事。其实不然。默认的Linux内核参数和系统配置是一个“通用”的妥协方案它试图在各种各样的硬件和应用场景下都表现“尚可”。但你的服务器是跑数据库、Web应用、还是做文件存储你的业务是CPU密集型、内存密集型还是I/O密集型这些“个性”需求默认配置是照顾不到的。不调优就等于让法拉利跑在限速40公里的市区道路上性能根本发挥不出来。更糟的是不当的配置可能导致在高并发下服务雪崩、内存泄漏被放大、或者磁盘提前报废。所以这篇文章的目的就是帮你把手里这台Linux服务器从“出厂设置”调整到“战斗状态”。我们不搞那些华而不实的“一键优化脚本”那玩意儿往往治标不治本还可能引入新问题。我会带你从性能监控分析开始找到真正的瓶颈所在然后针对CPU、内存、磁盘I/O、网络这四个核心子系统逐一讲解可落地的调优参数、原理和操作。最后我们还会聊聊安全与稳定性相关的调优以及如何制定适合自己业务的调优策略。无论你是运维工程师、后端开发者还是自己折腾VPS的个人用户这些内容都能让你对系统的掌控力提升一个档次。2. 性能分析的基石找准瓶颈比盲目优化更重要在动手调整任何一个参数之前你必须清楚一件事系统当前的瓶颈到底在哪里盲目调优就像蒙着眼睛给汽车做改装可能换了昂贵的火花塞结果发现是轮胎没气。Linux提供了一整套强大且直观的性能分析工具链我们的调优工作必须建立在数据之上。2.1 核心性能指标解读Load Average, CPU, Memory, I/O, Network首先你得知道看什么以及这些数字背后的含义。1. 平均负载Load Average这是最容易被误解的指标。通过uptime或top命令看到的那三个数字如0.05, 0.10, 0.15分别代表过去1分钟、5分钟、15分钟的系统平均负载。它的本质是“系统对CPU资源的需求队列长度”。简单来说就是有多少个任务正在使用或等待使用CPU以及在某些Linux版本中还包括不可中断的I/O等待任务。一个经验法则是对于单核CPU负载持续高于1说明CPU已经饱和对于4核CPU负载持续高于4说明CPU资源紧张。但更关键的是看趋势和结合其他指标。如果负载很高但CPU使用率ussy很低那瓶颈很可能在I/O上即任务在等待磁盘读写。2. CPU使用率使用top、htop或mpstat查看。关键字段us(user):用户空间进程占用CPU百分比。你的应用程序代码主要在这里。sy(system):内核空间占用CPU百分比。系统调用、中断处理等。id(idle):CPU空闲百分比。理想情况下业务平稳时应有足够的id。wa(iowait):极其重要CPU等待I/O完成的时间百分比。如果这个值持续很高比如5%几乎可以肯定磁盘是瓶颈。st(steal):在虚拟化环境中被宿主机“偷走”的CPU时间。如果很高说明宿主机资源过度超售。一个健康的CPU使用率分布us和sy会根据应用类型不同但wa应该保持低位。3. 内存使用不要只看free -m的free列Linux会充分利用空闲内存做磁盘缓存buff/cache所以看起来free很少是正常现象。关键看available:这个指标在较新版本的free命令中更真实地反映了可用于启动新应用的内存它考虑了缓存可被回收的部分。Swap使用率使用si(swap in) 和so(swap out)。如果这两个值持续不为0说明物理内存不足发生了内存交换这会严重拖慢性能。用vmstat 1可以动态观察。OOM风险关注/proc/meminfo中的CommitLimit和Committed_AS。如果Committed_AS接近甚至超过CommitLimit系统有触发OOMOut-Of-Memory killer的风险。4. 磁盘I/O这是Web应用、数据库最常见的瓶颈。使用iostat -x 1查看。util(%util):设备带宽利用率百分比。持续接近100%表示设备已饱和。await:平均每次I/O请求的等待时间毫秒。包括队列时间和服务时间。这个值直接影响到应用响应速度。svctm:平均每次I/O请求的服务时间毫秒。这个值应接近磁盘的物理性能如HDD约5-10msSSD约0.1-0.5ms。如果await远大于svctm说明队列很长磁盘忙不过来。r/s,w/s:每秒读写请求数。rkB/s,wkB/s:每秒读写数据量KB。5. 网络使用sar -n DEV 1或iftop、nethogs。吞吐量rxkB/s,txkB/s是否接近网卡带宽上限如千兆网卡约125MB/s。包量rxpck/s,txpck/s是否异常高高包量低吞吐可能是小包攻击或应用协议效率问题。错误与丢包rxerr/s,txerr/s,rxdrop/s,txdrop/s。任何持续的错误或丢包都需警惕可能是网卡、驱动或网络拥塞问题。2.2 实战分析使用工具链定位问题有了指标概念我们通过组合工具像侦探一样排查问题。场景一网站响应慢快速俯瞰top命令看负载和CPU的wa。如果wa高立即进入第2步。磁盘深度检查iostat -x 1观察哪个磁盘的util和await异常。假设是/dev/sdb。定位热点文件使用iotop需安装查看是哪个进程在疯狂读写/dev/sdb。假设是mysql进程。数据库内部诊断连接到MySQL使用SHOW PROCESSLIST;或慢查询日志找到具体的慢SQL。解决方案优化该SQL或考虑为数据库的日志文件如binlog、redo log使用单独的SSD磁盘。场景二程序偶尔卡顿内存不足内存压力检查vmstat 1关注si和so列。如果持续有数值说明在发生Swap交换。查看内存消耗大户ps aux --sort-%mem | head -20检查内核内存管理sar -B 1查看页换入换出pgpgin/s,pgpgout/s和缺页异常fault/s。如果majflt/s主要缺页需要磁盘I/O很高说明物理内存严重不足程序频繁从Swap换入数据。解决方案增加物理内存或者优化应用内存使用如减少Java堆大小、优化缓存策略并考虑适当调整vm.swappiness参数后续会讲。提示性能分析是一个持续对比的过程。建议在系统空闲时基线和业务高峰时压力分别采集一套数据使用sar或nmon工具记录对比差异能更精准地定位问题。3. CPU子系统调优让计算资源物尽其用CPU是系统的“大脑”调优的目标是减少不必要的上下文切换、让中断处理更高效、确保关键进程获得优先权。3.1 进程调度器与优先级策略Linux默认的进程调度器是CFS完全公平调度器。我们可以通过nice值和chrt命令来影响进程的优先级。nice值范围从 -20最高优先级到 19最低优先级。普通用户只能调低优先级增大nice值root可以调高。对于非关键的后台任务如备份、日志分析可以用nice -n 19 command启动避免它们抢占前端服务的CPU。# 以最低优先级运行压缩任务 nice -n 19 tar -czf backup.tar.gz /datachrt与实时优先级对于音视频处理、工业控制等对延迟极其敏感的任务可以使用实时调度策略SCHED_FIFO,SCHED_RR优先级高于所有普通进程。使用需极度谨慎配置不当可能导致系统无响应。# 以SCHED_FIFO策略优先级50运行一个任务仅root sudo chrt -f 50 ./realtime_app内核参数调优kernel.sched_min_granularity_ns(默认 3,000,000 ns 3ms):CFS调度器的最小时间片。对于CPU密集型且需要高响应的应用如HPC可以适当调小如echo 1000000 /proc/sys/kernel/sched_min_granularity_ns让调度更频繁提升交互性但会增加上下文切换开销。kernel.sched_migration_cost_ns(默认 500,000 ns):任务被迁移到其他CPU前需要在该CPU上运行多久才“值得”。在NUMA架构的服务器上减少此值可能有助于负载均衡但会增加迁移开销。3.2 中断亲和性IRQ Affinity减少CPU核间干扰在多核系统中硬件中断如网卡收包、磁盘读写完成默认可能由CPU0处理。这会导致CPU0负载很高而其他核空闲形成“中断风暴”。将中断均匀绑定到不同的CPU核心上可以显著提升性能。查看中断分布cat /proc/interrupts。找到你的高速网卡如eth0或NVMe SSD对应的中断号IRQ。设置亲和性假设我们有4个核心0-3想将中断IRQ 123绑定到CPU2和CPU3。# 查看当前亲和性 sudo cat /proc/irq/123/smp_affinity # 输出可能是 00000001 (16进制)表示只绑定到CPU0 # 设置亲和性到CPU2和CPU3 (二进制掩码...0011 十六进制 0x0c) echo 0c | sudo tee /proc/irq/123/smp_affinity更常见的做法是使用irqbalance服务它可以自动优化中断分配。对于高性能场景建议关闭irqbalance进行手动精细绑定。3.3 内核态与用户态减少上下文切换频繁的系统调用会导致CPU在用户态和内核态之间切换有开销。一些优化思路使用更高效的系统调用比如批量处理文件I/O时使用readv/writev或splice可能比多次read/write更好。调整fs.file-max系统最大文件句柄数。如果应用需要打开大量连接如Web服务器需要调大。# 临时修改 echo 6553560 /proc/sys/fs/file-max # 永久修改在 /etc/sysctl.conf 中添加 fs.file-max 6553560vm.dirty_ratio与vm.dirty_background_ratio这两个参数控制脏页被修改但未写回磁盘的内存页的回写策略间接影响I/O和CPU。如果系统有大量突发写操作适当调高vm.dirty_background_ratio如从10到15可以让内核在后台更平缓地回写避免应用进程在临界点时被阻塞住进行同步写从而减少CPU的wa时间。个人经验对于Web服务器如Nginx我通常会结合使用taskset将Nginx工作进程绑定到特定的CPU核上同时将网卡中断绑定到另一组核上实现CPU资源的物理隔离减少缓存失效cache miss能带来5%-10%的吞吐量提升。命令示例taskset -c 2,3 nginx -g ‘worker_processes 2;’。4. 内存子系统调优告别Swap高效利用每一分内存内存管理的目标是减少缺页异常、避免Swap交换、并合理利用内存作为缓存。4.1 Swap的罪与罚正确配置swappinessSwap是性能的“安全垫”也是“拖油瓶”。物理内存不足时不启用Swap可能导致OOM杀进程但频繁Swap又会引起性能骤降。关键在于控制内核使用Swap的“积极性”。vm.swappiness(默认值通常为60):值范围0-100。值越高内核越倾向于使用Swap值越低越倾向于保留文件系统缓存。对于数据库服务器/应用服务器强烈建议调低。因为数据库有自己的缓存机制如InnoDB Buffer Pool频繁Swap其内存页是灾难性的。通常设置为10甚至1。echo 10 /proc/sys/vm/swappiness # 永久生效在 /etc/sysctl.conf 中添加 vm.swappiness 10对于桌面系统可以保持默认或稍高以获得更好的交互体验避免因内存不足而卡死。极端情况禁用Swap设置为0。但注意这并不意味着完全不用Swap在内存严重不足时内核仍可能启动Swap。要完全禁用需要swapoff -a并注释掉/etc/fstab中的Swap行。4.2 透明大页Transparent HugePages, THP的取舍THP旨在通过自动将小内存页通常4KB合并成大页如2MB来减少TLB转址旁路缓存未命中次数提升内存访问性能。对于像Oracle DB、MongoDB这样的大内存应用开启THP确实有益。但是THP有一个致命缺点在内存碎片化严重时内核为了分配大页可能会进行非常耗时的内存压缩和迁移导致进程“卡住”表现为CPU使用率不高但系统无响应。这在MySQL服务器上尤为常见。查看THP状态cat /sys/kernel/mm/transparent_hugepage/enabled。输出[always] madvise neveralways表示启用。建议对于数据库服务器建议关闭THP。# 临时关闭 echo never /sys/kernel/mm/transparent_hugepage/enabled echo never /sys/kernel/mm/transparent_hugepage/defrag # 永久关闭在 /etc/rc.local 或 systemd service 中添加上述命令对于HPC或特定大内存应用可以开启并考虑使用madvise()系统调用在代码中显式请求大页。4.3 内存溢出保护与Overcommit策略Linux默认允许“超量承诺”Overcommit即允许程序申请的总内存超过物理内存Swap的总和基于“不是所有申请的内存都会立刻被使用”的假设。这提高了内存利用率但有OOM风险。vm.overcommit_memory0(默认): 启发式超量承诺。内核会进行一些粗略检查但基本允许。1: 总是允许。适用于科学计算等场景但风险极高。2: 禁止超量承诺。申请的内存不得超过CommitLimit物理内存Swap*vm.overcommit_ratio。这是最安全的模式尤其适合数据库等内存敏感型服务。echo 2 /proc/sys/vm/overcommit_memory # 设置超量承诺比率默认50即最多申请 (物理内存Swap)*50% echo 80 /proc/sys/vm/overcommit_ratioOOM Killer调优当内存耗尽时OOM Killer会选择一个“坏进程”杀掉。你可以通过/proc/pid/oom_score_adj来调整进程的“坏”程度-1000到1000。值越小越不容易被杀。对于关键服务如数据库主进程可以将其设为负值。echo -500 /proc/$(pgrep -f mysqld)/oom_score_adj5. 磁盘I/O子系统调优攻克性能的最大瓶颈对于大多数业务系统磁盘I/O是性能的终极瓶颈。调优的目标是降低延迟、提高吞吐量、让I/O请求更有序。5.1 文件系统挂载参数优化在/etc/fstab中调整挂载参数是成本最低、效果最明显的优化之一。# 原始挂载行可能类似 UUIDxxxx /data ext4 defaults 0 0 # 优化后的挂载行针对SSD或高速存储 UUIDxxxx /data ext4 noatime,nodiratime,datawriteback,barrier0,nobh 0 0让我们拆解这些参数noatime/nodiratime:强烈推荐启用。禁用每次文件访问时更新atime访问时间戳的特性。这可以避免大量不必要的写操作对Web服务器、版本控制仓库等场景提升显著。nodiratime是针对目录的类似选项。datawriteback(仅ext3/ext4):默认是dataordered保证数据写入前先写元数据journal更安全但性能稍差。writeback模式提供更好的性能但在系统崩溃时可能造成文件数据损坏元数据仍一致。对于非关键数据或已有上层应用保证如数据库的redo log可以考虑使用。barrier0:禁用写入屏障。屏障用于保证日志数据在对应数据块之前落盘对数据安全很重要。在配备电池备份缓存BBU的RAID卡或UPS保护的系统中可以禁用以获得性能提升。普通硬件慎用nobh:不缓存缓冲区头在某些写密集型场景有性能提升。对于XFS文件系统常用于大容量存储优化参数有所不同UUIDxxxx /data xfs defaults,noatime,nodiratime,allocsize1m,inode64,swalloc 0 0allocsize1m: 提高大文件连续分配的效率。inode64: 允许inode号在64位空间分配适合超大文件系统。5.2 I/O调度器选择与配置I/O调度器决定了内核如何处理块设备的I/O请求队列。不同的工作负载适合不同的调度器。查看当前调度器cat /sys/block/sda/queue/scheduler。输出可能如[mq-deadline] kyber bfq none方括号内为当前使用的。常见调度器mq-deadline(多队列最后期限):适用于大多数场景尤其是混合读写或数据库。它为请求设置最后期限防止读写饥饿是多队列设备NVMe 现代SSD/HDD的默认或推荐选择。kyber:针对低延迟设备如NVMe SSD设计通过两个目标读取延迟、写入延迟来自适应调整队列深度。bfq(预算公平队列):类似于CFS试图为进程提供公平的I/O带宽。适合桌面系统或需要保证交互性的环境。none(无操作调度器):直接将请求交给设备通常设备自身有较好的调度能力如高端NVMe SSD。这是性能最高的选项但完全放弃了内核的调度公平性。如何选择NVMe SSD:优先尝试none如果发现个别进程饿死其他进程则换用kyber或mq-deadline。SATA SSD / HDD (多队列):使用mq-deadline。桌面系统使用bfq获得更平滑的体验。设置调度器# 临时设置为 mq-deadline echo mq-deadline | sudo tee /sys/block/sda/queue/scheduler # 永久设置使用 udev 规则 # 创建文件 /etc/udev/rules.d/60-io-scheduler.rules # 内容ACTIONadd|change, KERNELsd[a-z]|nvme[0-9]n[0-9], ATTR{queue/scheduler}mq-deadline5.3 调整队列深度与预读队列深度 (nr_requests):每个块设备请求队列的长度。增加队列深度可以让设备尤其是SSD更好地进行内部并行处理提升吞吐量但可能增加延迟。对于高速SSD可以适当增加。# 查看当前值 cat /sys/block/sda/queue/nr_requests # 默认可能是 128对于NVMe SSD可以尝试增加到 256 或 512 echo 256 | sudo tee /sys/block/sda/queue/nr_requests预读大小 (read_ahead_kb):内核预读的数据量。对于顺序读性能关键的应用如视频流、大数据分析增加预读可以大幅提升性能。# 查看当前值 cat /sys/block/sda/queue/read_ahead_kb # 默认可能是 128对于大文件顺序读可以增加到 1024 或 2048 echo 2048 | sudo tee /sys/block/sda/queue/read_ahead_kb踩坑实录有一次我们的一台数据库服务器SATA SSD在业务高峰时I/O延迟飙升。检查后发现调度器是cfq旧内核的默认值队列深度只有128。我们将其改为mq-deadline并将nr_requests增加到512read_ahead_kb增加到1024。调整后iostat显示的await从平均50ms降到了8ms以下效果立竿见影。关键是要根据硬件类型HDD/SSD/NVMe和工作负载随机/顺序来组合调整这些参数。6. 网络子系统调优应对高并发连接的挑战对于Web服务器、API网关、代理服务器网络栈的调优至关重要目标是处理更多的并发连接、降低延迟、避免丢包。6.1 TCP/IP协议栈核心参数调优这些参数通过sysctl命令修改主要配置文件是/etc/sysctl.conf。连接管理# 增大最大连接数取决于内存一个连接约消耗2-4KB net.core.somaxconn 65535 # 监听套接字listen的队列长度高并发必须调大 net.ipv4.tcp_max_syn_backlog 65535 # SYN队列长度 # 启用TCP快速打开TFO减少握手延迟客户端和服务端需同时支持 net.ipv4.tcp_fastopen 3 # 启用TCP时间戳用于PAWS防止序号绕回和RTT测量对高速网络有益 net.ipv4.tcp_timestamps 1缓冲区与窗口大小# 调整TCP读写缓冲区大小自动调整的最小、默认、最大值 # 单位是字节根据网络带宽和延迟BDP 带宽 * 延迟计算 # 例如1Gbps带宽10ms RTTBDP ≈ 1.25MB。设置应大于BDP。 net.ipv4.tcp_rmem 4096 87380 16777216 # 读缓冲区 min default max net.ipv4.tcp_wmem 4096 65536 16777216 # 写缓冲区 min default max net.core.rmem_max 16777216 net.core.wmem_max 16777216 # 调整套接字接收缓冲区大小 net.core.rmem_default 262144 net.core.wmem_default 262144连接回收与重用# 启用TIME-WAIT状态的快速回收和重用对于短连接服务如HTTP非常关键 # 注意在NAT环境下需谨慎可能引起问题 net.ipv4.tcp_tw_reuse 1 net.ipv4.tcp_tw_recycle 0 # 该参数在较新内核中已废弃且不建议使用 # 调整FIN-WAIT-2状态的超时时间 net.ipv4.tcp_fin_timeout 30 # 启用TCP Keepalive net.ipv4.tcp_keepalive_time 600 net.ipv4.tcp_keepalive_intvl 60 net.ipv4.tcp_keepalive_probes 5拥塞控制算法Linux内核提供了多种拥塞控制算法如cubic(默认),bbr,reno等。cubic:适合广域网是默认算法。bbr(Bottleneck Bandwidth and RTT):由Google开发在高丢包、高带宽、长延迟的网络如国际互联网上表现优异能显著提升吞吐量并降低延迟。# 查看可用算法 sysctl net.ipv4.tcp_available_congestion_control # 设置当前算法 sysctl -w net.ipv4.tcp_congestion_controlbbr # 永久生效在 /etc/sysctl.conf 中添加 net.ipv4.tcp_congestion_control bbr6.2 文件描述符与网络连接限制单个进程能打开的文件数包括网络连接受ulimit限制。对于高并发服务器如Nginx必须调大。系统级全局限制# 查看当前值 cat /proc/sys/fs/file-max # 临时修改 echo 6553560 /proc/sys/fs/file-max用户/进程级限制修改/etc/security/limits.conf# 在文件末尾添加例如为nginx用户设置 nginx soft nofile 65535 nginx hard nofile 65535 * soft nofile 65535 # 为所有用户设置默认值 * hard nofile 65535修改后需要重新登录或重启相关服务生效。6.3 网卡多队列与RSS接收端缩放现代服务器网卡支持多队列Multiple Queues和RSS可以将网络流量分散到多个CPU核心处理突破单核瓶颈。检查是否支持及当前队列数ethtool -l eth0。输出会显示“Combined”的最大值和当前值。设置队列数等于或小于CPU核心数sudo ethtool -L eth0 combined 8。配合中断亲和性IRQ Affinity将每个队列的中断绑定到不同的CPU核心。这通常需要编写脚本或使用irqbalance的配置来实现自动绑定。网络调优验证调整后可以使用netstat -s或ss -s查看TCP状态统计关注listen drops,TCP timeouts等错误计数是否减少。使用iperf3或netperf进行带宽和延迟测试对比调优前后的变化。7. 安全、稳定与持续优化调优不只是追求性能还要兼顾系统的稳定性和安全性。7.1 内核参数安全加固一些性能调优参数可能带来安全风险需要权衡。禁用ICMP重定向防止攻击者篡改路由表。net.ipv4.conf.all.accept_redirects 0 net.ipv4.conf.default.accept_redirects 0 net.ipv6.conf.all.accept_redirects 0禁用源路由net.ipv4.conf.all.accept_source_route 0启用SYN Cookies防护SYN Flood攻击net.ipv4.tcp_syncookies 17.2 资源限制cgroups与隔离对于多租户或混合部署的环境使用cgroupsControl Groups来限制进程组的资源使用CPU、内存、I/O防止单个应用耗尽系统资源。使用systemd管理服务资源现代Linux发行版通常使用systemd它集成了cgroups。你可以为某个服务创建切片slice或直接修改服务单元文件。# 编辑 /etc/systemd/system/mysql.service.d/limits.conf [Service] CPUQuota150% # 限制最多使用1.5个核心的CPU时间 MemoryLimit4G # 限制内存使用 IOWriteBandwidthMax/dev/sda 100M # 限制磁盘写带宽使用cpulimit工具临时限制对于命令行启动的进程可以使用cpulimit -l 50 -p pid来限制其CPU使用率不超过50%。7.3 建立性能基线与监控调优不是一劳永逸的。业务在增长硬件在变化。你需要建立基线在系统刚部署或每次重大变更后在已知的“健康”状态下使用一套标准工具如sysbench,fio,iperf3和监控指标通过prometheusnode_exportergrafana记录下性能基线。持续监控部署监控系统持续跟踪关键指标CPU、内存、磁盘I/O、网络、负载。设置合理的告警阈值如磁盘使用率85%内存可用10%。变更管理任何内核参数或系统配置的修改都应该有记录、有回滚方案。先在测试环境验证再灰度应用到生产环境。每次变更后对比监控曲线确认优化效果或发现副作用。调优是一门实践的艺术没有放之四海而皆准的“银弹”。最核心的思路永远是监控 - 分析 - 假设 - 调整 - 验证。从本文提供的这些“工具箱”里根据你实际遇到的瓶颈选择合适的工具和方法大胆假设小心验证。当你看到调整一个参数后监控图表上的延迟曲线应声而落时那种成就感就是运维和架构工作最大的乐趣之一。
返回列表