最新要闻

广告

手机

光庭信息跌4.57% 2021上市超募11亿2022扣非降74% 时快讯

光庭信息跌4.57% 2021上市超募11亿2022扣非降74% 时快讯

搜狐汽车全球快讯 | 大众汽车最新专利曝光:仪表支持拆卸 可用手机、平板替代-环球关注

搜狐汽车全球快讯 | 大众汽车最新专利曝光:仪表支持拆卸 可用手机、平板替代-环球关注

家电

环球报道:Linux调优+Tomcat调优,超级干货,一定珍藏

来源:博客园

文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版为您奉上珍贵的学习资源 :

免费赠送 :《尼恩Java面试宝典》持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备免费赠送 :《尼恩技术圣经+高并发系列PDF》,帮你 实现技术自由,完成职业升级, 薪酬猛涨!加尼恩免费领免费赠送 经典图书:《Java高并发核心编程(卷1)加强版》面试必备 + 大厂必备 +涨薪必备 加尼恩免费领免费赠送 经典图书:《Java高并发核心编程(卷2)加强版》面试必备 + 大厂必备 +涨薪必备 加尼恩免费领免费赠送 经典图书:《Java高并发核心编程(卷3)加强版》面试必备 + 大厂必备 +涨薪必备 加尼恩免费领

免费赠送 资源宝库: Java 必备 百度网盘资源大合集 价值>10000元 加尼恩领取


(资料图)

Linux调优+Tomcat调优,超级干货,一定珍藏

说在前面

40岁老架构师尼恩的读者社群(50+)中,很多小伙伴拿不到offer,或者拿不到好的offer

尼恩经常给大家 优化项目,优化简历,挖掘技术亮点。

在指导简历的过程中, 线上问题排查、Java 调优是一项很重要的指导。

对于架构师、高级开发来说, 调优和线上问题排查是 核心内容, 更是内功中的内功。

尼恩团队结合资深架构经验和行业案例,给大家梳理一个系列的《Java 调优圣经PDF,包括本文在内规划的6个部分:

(1) 调优圣经1:零基础精通Jmeter分布式压测,10Wqps+压测实操 (已经完成)

(2) 调优圣经2:从70s到20ms,一次3500倍性能优化实战,方案人人可用 (已经完成)

(3) 调优圣经3:如何做mysql调优?绝命7招让慢SQL调优100倍,实现你的Mysql调优自由 (已经完成)

(4) 调优圣经4:SpringBoot假死,十万火急,怎么救火? (已经完成)

(5) 调优圣经5:零基础精通JVM调优实操,实现JVM自由 (已经完成)

(6) 调优圣经6:零基础精通Linux、Tomcat调优实操,实现基础设施调优自由(本文)

最新《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》的PDF文件,请到公号【技术自由圈】取

本文目录

目录
  • Linux调优+Tomcat调优,超级干货,一定珍藏
    • 说在前面
    • 本文目录
    • 引言
    • Linux服务器调优实战
      • 监控服务器性能
      • 内核参数调优
        • 1. 了解常用的内核参数及其作用
        • 2. 优化策略
      • 文件系统优化
        • 1. 选择合适的文件系统类型
        • 2. 调整文件系统参数以提升性能
      • 网络优化
        • 1. 调整网络参数以提高网络性能
        • 2.TCP参数调优
        • 3. 使用高性能网络协议如RDMA
      • 内存管理和交换空间
        • 1. 了解Linux内存管理机制
        • 2. 调整内存参数以提升性能
        • 3. 优化交换空间的使用
    • Spring Boot内置Tomcat调优实战
      • 调整Spring Boot Tomcat参数
        • 1. 调整连接器参数以优化网络性能
        • 2. 调整线程池参数以提高并发处理能力
        • 3. 上传文件配置优化
      • 缓存和会话管理优化
      • Spring Boot Tomcat安全性优化
      • Spring Boot Tomcat日志管理
    • 小结
    • 《Java 调优圣经》迭代计划
    • 技术自由的实现路径 PDF:
      • 实现你的 响应式 自由:
      • 实现你的 spring cloud 自由:
      • 实现你的 linux 自由:
      • 实现你的 网络 自由:
      • 实现你的 分布式锁 自由:
      • 实现你的 王者组件 自由:
      • 实现你的 面试题 自由:
    • 获取11个技术圣经PDF:

引言

在当今的软件开发领域中,Spring Boot已经成为构建高效、可扩展和灵活的Java应用程序的首选框架。然而,当我们的Spring Boot项目部署在Linux服务器上时,有时我们可能会面临性能不足的挑战。这种性能瓶颈可能会导致延迟增加、响应时间变慢甚至系统崩溃,从而影响用户体验和业务流程。

为了克服这些性能问题,我们需要深入了解Linux服务器和Spring Boot内置的Tomcat服务器,并学习如何对它们进行调优。

Linux服务器作为Spring Boot项目的托管环境,其配置和优化对于确保系统的稳定性和性能至关重要。

而Spring Boot内置的Tomcat服务器则负责处理HTTP请求和响应,它的配置和优化可以直接影响到系统的并发处理能力和响应时间。

通过对Linux服务器和Spring Boot内置的Tomcat进行调优,我们可以最大限度地利用系统资源,提高系统的性能和吞吐量,同时增强系统的稳定性和可靠性。

优化Linux服务器可以涉及内核参数调整、文件系统优化、网络配置优化以及内存管理等方面。

而在调优Spring Boot内置的Tomcat时,我们可以调整JVM参数、优化连接器和线程池配置、进行缓存和会话管理优化,以及加强安全性和日志管理等。

本文将深入探讨Linux服务器和Spring Boot内置的Tomcat调优的实操内容。

我们将介绍常用的调优技术和策略,以及实际操作的步骤和示例。通过这些调优实操,您将能够充分发挥Linux服务器和Spring Boot内置的Tomcat的潜力,满足项目的性能需求,提升用户体验,并确保系统在高负载和大流量的情况下依然稳定可靠。

让我们一起深入学习和实践,掌握Linux服务器和Spring Boot内置的Tomcat调优的关键技术,为我们的应用程序打造一个高效、可靠且具有良好性能的部署环境。

Linux服务器调优实战

Linux作为一种强大而稳定的操作系统,广泛应用于服务器环境中。然而,在部署和运行Spring Boot项目时,我们可能会面临一些性能方面的挑战,这可能影响到应用程序的响应时间和整体性能。因此,对Linux服务器进行调优是至关重要的,它可以帮助我们最大限度地提升系统的性能、可靠性和稳定性。

本章将重点介绍如何在CentOS操作系统上进行Linux服务器调优。CentOS是一种基于Linux的免费开源操作系统,具有广泛的应用和强大的社区支持。通过针对CentOS进行调优,我们将学习如何最大限度地利用系统资源,优化内核参数、文件系统、网络和内存管理,以提升服务器的性能。

监控服务器性能

在Linux服务器调优中,监控系统的性能是非常重要的一步。通过监控工具,我们可以实时了解服务器的资源利用情况,如CPU、内存、磁盘和网络,以便及时发现性能瓶颈并进行优化。本节将介绍如何安装和配置监控工具,并展示如何监控系统资源并分析监控数据以发现性能瓶颈。

  1. 安装和配置监控工具

首先,我们需要安装一个强大而灵活的监控工具来监控服务器性能。在本实例中,我们将使用常见的工具"top"和"Sar"。

  • 安装procps工具包:procps软件包包含监视和终止系统进程的程序。它通过/proc目录搜集进程的信息.

安装该软件包将

1)安装下列程序

  • free显示系统中可用的和已经使用的物理内存和交换空间,以及内核使用的共享内存和缓冲区。
  • kill向进程发信号。
  • pgrep按照名字或者其他属性查找进程。
  • pkill按照名字或者其他属性结束进程。
  • pmap报告指定进程的内存图。
  • ps显示一个当前进程的快照。
  • skill向符合某个条件的进程发出信号。
  • snice改变符合某个条件进程的调度优先级。
  • sysctl系统运行时改变内核的参数。
  • tload在指定的tty终端上显示系统当前平均负载的示意图。
  • top实时观察进程的活动情况。
  • uptime显示系统运行了多长时间,有多少用户登陆,系统的负载情况。
  • vmstat报告虚拟内存状态。包括进程、内存、分页、块设备的读写、中断和CPU的活 动。
  • w显示当前登录的用户信息,以及他们的进程。
  • watch重复运行某个命令,满屏显示其输出。
  • libproc包含本软件包中大多数程序都要使用的函数。

2)安装下列库文件

libproc.so*

安装命令和过程如下:

[root@cdh1 ~]# sudo yum install -y procpsLast metadata expiration check: 3:12:06 ago on Thu 29 Jun 2023 12:32:43 PM CST.Package procps-ng-3.3.15-1.el8.x86_64 is already installed.Dependencies resolved.============================================================================================== Package                Architecture        Version                   Repository         Size==============================================================================================Upgrading: procps-ng              x86_64              3.3.15-6.el8              base              329 kTransaction Summary==============================================================================================Upgrade  1 PackageTotal download size: 329 kDownloading Packages:procps-ng-3.3.15-6.el8.x86_64.rpm                             222 kB/s | 329 kB     00:01----------------------------------------------------------------------------------------------Total                                                         222 kB/s | 329 kB     00:01Running transaction checkTransaction check succeeded.Running transaction testTransaction test succeeded.Running transaction  Preparing        :                                                                      1/1  Upgrading        : procps-ng-3.3.15-6.el8.x86_64                                        1/2  Cleanup          : procps-ng-3.3.15-1.el8.x86_64                                        2/2  Running scriptlet: procps-ng-3.3.15-1.el8.x86_64                                        2/2  Verifying        : procps-ng-3.3.15-6.el8.x86_64                                        1/2  Verifying        : procps-ng-3.3.15-1.el8.x86_64                                        2/2Upgraded:  procps-ng-3.3.15-6.el8.x86_64Complete!
  • 安装sysstat工具包:sysstat 是 Linux 系统中的常用工具包。它的主要用途是观察服务负载,比如CPU和内存的占用率、网络的使用率以及磁盘写入和读取速度等。sysstat 工具包中包含两类工具:
    • 即时查看工具:iostat、mpstat、sar
    • 累计统计工具:sar也就是说,sar 具有这两种功能。因此,sar 是 sysstat 中的核心工具。为了实现 sar 的累计统计,系统必须周期地记录当时的信息,这是通过调用 /usr/lib/sa/ 中的三个工具实现的:
    • sa1 :收集并存储每天系统动态信息到一个二进制的文件中,用作 sadc 的前端程序
    • sa2 :收集每天的系统活跃信息写入总结性的报告,用作 sar 的前端程序
    • sadc :系统动态数据收集工具,收集的数据被写入一个二进制的文件中,它被用作 sar 工具的后端

安装命令及过程如下:

[root@cdh1 ~]# sudo yum install -y sysstatLast metadata expiration check: 3:15:03 ago on Thu 29 Jun 2023 12:32:43 PM CST.Dependencies resolved.==================================================================================================================================== Package                        Architecture          Version                                        Repository                Size====================================================================================================================================Installing: sysstat                        x86_64                11.7.3-6.el8                                   AppStream                425 kInstalling dependencies: lm_sensors-libs                x86_64                3.4.0-23.20180522git70f7e08.el8                base                      59 kTransaction Summary====================================================================================================================================Install  2 PackagesTotal download size: 484 kInstalled size: 1.5 MDownloading Packages:(1/2): lm_sensors-libs-3.4.0-23.20180522git70f7e08.el8.x86_64.rpm                                   138 kB/s |  59 kB     00:00(2/2): sysstat-11.7.3-6.el8.x86_64.rpm                                                              220 kB/s | 425 kB     00:01------------------------------------------------------------------------------------------------------------------------------------Total                                                                                               250 kB/s | 484 kB     00:01Running transaction checkTransaction check succeeded.Running transaction testTransaction test succeeded.Running transaction  Preparing        :                                                                                                            1/1  Installing       : lm_sensors-libs-3.4.0-23.20180522git70f7e08.el8.x86_64                                                     1/2  Running scriptlet: lm_sensors-libs-3.4.0-23.20180522git70f7e08.el8.x86_64                                                     1/2  Installing       : sysstat-11.7.3-6.el8.x86_64                                                                                2/2  Running scriptlet: sysstat-11.7.3-6.el8.x86_64                                                                                2/2  Verifying        : lm_sensors-libs-3.4.0-23.20180522git70f7e08.el8.x86_64                                                     1/2  Verifying        : sysstat-11.7.3-6.el8.x86_64                                                                                2/2Installed:  lm_sensors-libs-3.4.0-23.20180522git70f7e08.el8.x86_64                         sysstat-11.7.3-6.el8.x86_64Complete!
  1. 监控系统资源

接下来,我们将使用安装的监控工具来监控系统资源。使用以下命令来监控CPU、内存、磁盘和网络的使用情况:

  • 监控CPU利用率:
[root@cdh1 ~]# toptop - 15:48:20 up  4:10,  1 user,  load average: 0.35, 0.18, 0.12Tasks: 122 total,   1 running, 121 sleeping,   0 stopped,   0 zombie%Cpu(s):  0.2 us,  0.0 sy,  0.0 ni, 99.2 id,  0.2 wa,  0.3 hi,  0.2 si,  0.0 stMiB Mem :   7810.2 total,   4942.9 free,   1856.0 used,   1011.3 buff/cacheMiB Swap:      0.0 total,      0.0 free,      0.0 used.   5693.3 avail Mem    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND   4079 root      20   0 3034096 315292  18328 S   0.7   3.9   1:10.41 java   1307 root      20   0 3641916 684908  24092 S   0.3   8.6   1:11.22 java   6772 root      20   0 3031844 307588  19560 S   0.3   3.8   0:52.58 java      1 root      20   0  179924  14200   9096 S   0.0   0.2   0:01.40 systemd      2 root      20   0       0      0      0 S   0.0   0.0   0:00.00 kthreadd      3 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_gp      4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_par_gp      6 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/0:0H-kblockd      8 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 mm_percpu_wq      9 root      20   0       0      0      0 S   0.0   0.0   0:00.03 ksoftirqd/0     10 root      20   0       0      0      0 I   0.0   0.0   0:01.33 rcu_sched     11 root      rt   0       0      0      0 S   0.0   0.0   0:00.00 migration/0     12 root      rt   0       0      0      0 S   0.0   0.0   0:00.00 watchdog/0     13 root      20   0       0      0      0 S   0.0   0.0   0:00.00 cpuhp/0     14 root      20   0       0      0      0 S   0.0   0.0   0:00.00 cpuhp/1     15 root      rt   0       0      0      0 S   0.0   0.0   0:00.00 watchdog/1

在top命令的输出中,可以看到各个进程的CPU利用率、负载情况、系统的内存使用情况,包括已用内存、空闲内存、缓存和交换空间等。

  • 监控磁盘使用情况:
[root@cdh1 ~]# df -hFilesystem      Size  Used Avail Use% Mounted ondevtmpfs        3.8G     0  3.8G   0% /devtmpfs           3.9G     0  3.9G   0% /dev/shmtmpfs           3.9G   17M  3.8G   1% /runtmpfs           3.9G     0  3.9G   0% /sys/fs/cgroup/dev/sda2        50G   15G   36G  29% /vagrant         401G   99G  303G  25% /vagranttmpfs           782M     0  782M   0% /run/user/0overlay          50G   15G   36G  29% /var/lib/docker/overlay2/e69110c0d30fa539dfe2cadf20b9361d37f23b3ff93a650982f8cc06e8b8b613/mergedoverlay          50G   15G   36G  29% /var/lib/docker/overlay2/4478bfab332f0a954024ffbee69ced83c67f8fef26784b634cf1e54aa1284890/mergedoverlay          50G   15G   36G  29% /var/lib/docker/overlay2/46d554315310d2fa8e964fceb621861dc47f06c28cd4aa26972932863885e1c9/mergedshm              64M     0   64M   0% /var/lib/docker/containers/1d00f3ade2b64c4f014bb84c2f8b1bd2a3d879941b2df673008c7594cda4579c/mounts/shmshm              64M     0   64M   0% /var/lib/docker/containers/11b6e036050c11278ec0344c974bc2caace0df59481636d23f6c97befb030048/mounts/shmshm              64M     0   64M   0% /var/lib/docker/containers/129a46feed7737ad6a804ec2b27b31f88c05b99563391aa941ff91b247c91d84/mounts/shm

该命令将显示服务器上各个磁盘分区的使用情况,包括已用空间、可用空间和挂载点等。

  • 监控网络流量:
[root@cdh1 ~]# sar -n DEV 1Linux 4.18.0-193.19.1.el8_2.x86_64 (cdh1)       06/29/2023      _x86_64_        (2 CPU)03:49:52 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil03:49:53 PM      eth1      1.00      1.00      0.06      0.16      0.00      0.00      0.00      0.0003:49:53 PM br-b4b24a4b375b      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.0003:49:53 PM veth5731f9f      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

此命令将显示每秒钟的网络接口流量,包括接收和发送的数据量。

  1. 分析监控数据并发现性能瓶颈

一旦我们开始监控服务器性能,我们需要分析监控数据以发现性能瓶颈。

以下是一些常见的性能瓶颈指标和分析方法:

  • CPU利用率高:可能存在CPU密集型任务,可以通过优化算法或增加CPU资源来解决。
  • 内存不足:可能导致交换空间过多,影响性能。可以考虑增加内存或优化内存使用。
  • 磁盘IO瓶颈:可能导致IO延迟增加,可以通过使用SSD、优化文件系统或调整IO调度器来解决。
  • 网络流量过大:可能导致网络拥塞或延迟增加,可以考虑增加带宽或优化网络配置。

通过对监控数据进行持续分析,我们可以定位性能瓶颈并采取相应的优化措施来改善服务器的性能。

通过本节的实操,可以了解到如何安装和配置监控工具,并使用它们来监控Linux服务器的性能。您还将了解如何分析监控数据以发现性能瓶颈,为后续的调优工作奠定基础。记住,监控是持续进行的过程,可以帮助您及时发现问题并采取相应的措施来提升服务器的性能和稳定性。

内核参数调优

在Linux服务器调优中,调整内核参数是提升系统性能和稳定性的关键步骤。通过优化内核参数,我们可以对系统的行为和资源管理进行精细调控,以最大限度地利用硬件资源并提升系统的性能。

本节将介绍常用的内核参数及其作用,并提供一些常见的内核参数调优策略,帮助您优化系统性能。

1. 了解常用的内核参数及其作用

在调优内核参数之前,我们首先需要了解一些常用的内核参数及其作用。以下是一些常见的内核参数:

  • vm.swappiness:控制系统在内存不足时交换空间的使用程度。
  • vm.dirty_ratio和vm.dirty_background_ratio:控制脏页面在内存中的比例。
  • net.core.somaxconn:设置TCP监听队列的最大长度。
  • net.ipv4.tcp_fin_timeout:控制TCP连接关闭后的等待时间。
  • fs.file-max:设置系统可打开文件描述符的最大数量。

2. 优化策略

2.1 内存优化

  • 调整vm.swappiness参数:减少交换空间的使用,将其值设置为较低的数值,如10。
[root@cdh1 ~]# echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.confvm.swappiness=10[root@cdh1 ~]# sudo sysctl -pfs.nr_open = 1500000fs.file-max = 1500000vm.swappiness = 1vm.max_map_count = 262144net.core.somaxconn = 32768vm.swappiness = 10fs.file-max = 100000vm.swappiness = 10
  • 增加vm.dirty_ratio和vm.dirty_background_ratio的值:这会减少写回磁盘的频率,提高性能。
[root@cdh1 ~]# echo "vm.dirty_ratio=80" | sudo tee -a /etc/sysctl.confvm.dirty_ratio=80[root@cdh1 ~]# echo "vm.dirty_background_ratio=10" | sudo tee -a /etc/sysctl.confvm.dirty_background_ratio=10[root@cdh1 ~]# sudo sysctl -pfs.nr_open = 1500000fs.file-max = 1500000vm.swappiness = 1vm.max_map_count = 262144net.core.somaxconn = 32768vm.swappiness = 10fs.file-max = 100000vm.swappiness = 10vm.dirty_ratio = 80vm.dirty_background_ratio = 10

2.2 网络优化

  • 增加net.core.somaxconn参数的值:增加TCP监听队列的长度,以处理更多的并发连接请求。
[root@cdh1 ~]# echo "net.core.somaxconn=65535" | sudo tee -a /etc/sysctl.confnet.core.somaxconn=65535[root@cdh1 ~]# sudo sysctl -pfs.nr_open = 1500000fs.file-max = 1500000vm.swappiness = 1vm.max_map_count = 262144net.core.somaxconn = 32768vm.swappiness = 10fs.file-max = 100000vm.swappiness = 10vm.dirty_ratio = 80vm.dirty_background_ratio = 10net.core.somaxconn = 65535
  • 调整net.ipv4.tcp_fin_timeout参数:缩短TCP连接关闭后的等待时间,释放连接资源的速度更快。
[root@cdh1 ~]# echo "net.ipv4.tcp_fin_timeout=15" | sudo tee -a /etc/sysctl.confnet.ipv4.tcp_fin_timeout=15[root@cdh1 ~]# sudo sysctl -pfs.nr_open = 1500000fs.file-max = 1500000vm.swappiness = 1vm.max_map_count = 262144net.core.somaxconn = 32768vm.swappiness = 10fs.file-max = 100000vm.swappiness = 10vm.dirty_ratio = 80vm.dirty_background_ratio = 10net.core.somaxconn = 65535net.ipv4.tcp_fin_timeout = 15

2.3 文件系统优化

  • 增加fs.file-max参数的值:增加可打开文件描述符的数量,以支持更多的并发连接和文件操作。
[root@cdh1 ~]# echo "fs.file-max=100000" | sudo tee -a /etc/sysctl.conffs.file-max=100000[root@cdh1 ~]# sudo sysctl -pfs.nr_open = 1500000fs.file-max = 1500000vm.swappiness = 1vm.max_map_count = 262144net.core.somaxconn = 32768vm.swappiness = 10fs.file-max = 100000vm.swappiness = 10vm.dirty_ratio = 80vm.dirty_background_ratio = 10net.core.somaxconn = 65535net.ipv4.tcp_fin_timeout = 15fs.file-max = 100000
  • 优化文件系统的挂载选项:根据具体的应用需求,选择合适的挂载选项,如使用noatime禁用访问时间更新、使用nodiratime禁用目录访问时间更新等。

以下是一些常见的文件系统挂载选项及其作用:

  1. noatime:禁用访问时间更新
    • 作用:默认情况下,每次文件被访问时,文件系统都会更新访问时间。禁用访问时间更新可以减少磁盘IO操作,提升文件系统性能。
    • 示例:mount -o remount,noatime /dev/sda1
  2. nodiratime:禁用目录访问时间更新
    • 作用:类似于noatime选项,但只禁用目录的访问时间更新。对于包含大量文件的目录,禁用目录访问时间更新可以减少IO操作。
    • 示例:mount -o remount,nodiratime /dev/sda1
  3. relatime:相对访问时间更新
    • 作用:相对于atime选项,relatime选项会更新文件的访问时间,但只在上次访问时间早于或等于修改时间的情况下进行更新。这样可以在不过度增加IO操作的情况下,保持atime功能的一部分。
    • 示例:mount -o remount,relatime /dev/sda1
  4. noexec:禁止在该文件系统上执行可执行文件
    • 作用:该选项可以防止在文件系统上执行恶意或不必要的可执行文件,提高系统的安全性。
    • 示例:mount -o remount,noexec /dev/sda1
  5. nosuid:禁止设置SUID和SGID权限
    • 作用:SUID和SGID权限允许执行程序以文件所有者的权限运行,可能存在安全风险。使用nosuid选项可以禁止设置SUID和SGID权限。
    • 示例:mount -o remount,nosuid /dev/sda1
  6. noauto:禁止自动挂载
    • 作用:默认情况下,系统会在启动时自动挂载文件系统。使用noauto选项可以禁止自动挂载,需要手动执行挂载命令。
    • 示例:mount -o remount,noauto /dev/sda1
  7. data=writeback:写回模式
    • 作用:默认情况下,Linux会采用数据写入完整性的方式来处理文件系统的写操作。使用data=writeback选项可以启用写回模式,提升写入性能,但可能会增加数据损坏的风险。
    • 示例:mount -o remount,data=writeback /dev/sda1

这些是常见的文件系统挂载选项示例,您可以根据实际需求选择适合的选项进行挂载。请注意,在更改文件系统的挂载选项时,务必谨慎操作,并在实施之前备份相关配置文件,以防止数据丢失或其他意外情况的发生。

请注意,以上优化策略只是一些常见的示例,具体的优化策略应根据实际应用场景和需求进行调整。

通过调整内核参数并采用适当的策略,我们可以最大限度地优化系统性能,提升服务器的响应能力和稳定性。在实施之前,请务必备份相关配置文件,并谨慎测试和验证调整后的效果。

尼恩提示:以上内容比较复杂,而且非常重要。如何把以上内容搞清楚? 可以看本文的配套视频《调优圣经,老架构师带实现简历脱胎换骨》。

如果想把调优圣经写入简历,可以找老架构师尼恩提供简历辅导,保证简历金光闪闪、天衣无缝。

文件系统优化

文件系统在Linux服务器中起着关键的作用,直接影响到数据的存储、访问和性能。通过选择合适的文件系统类型、调整文件系统参数以及优化RAID和LVM的使用,我们可以提升系统的文件系统性能和可靠性。

本节将介绍如何选择合适的文件系统类型,调整文件系统参数以提升性能,并探讨如何使用和优化RAID和LVM。

1. 选择合适的文件系统类型

在选择文件系统类型时,应考虑以下因素:

  • ext4:是Linux最常用的文件系统类型,具有良好的性能和稳定性。
  • XFS:适用于大型文件和大容量存储,支持快速修复和高性能。
  • Btrfs:具有快照、压缩和校验功能,适用于需要高级特性的应用。
  • ZFS:具有强大的数据完整性和管理功能,适用于大规模存储环境。

选择适合应用需求的文件系统类型,并在安装或格式化磁盘时选择相应的文件系统。

2. 调整文件系统参数以提升性能

  • 考虑调整文件系统的块大小(block size):对于存储大文件的场景,增大块大小可以提高性能;对于存储小文件的场景,较小的块大小可以节省磁盘空间。使用适当的工具(例如mkfs命令)对磁盘进行格式化,并在格式化过程中选择所需的块大小。例如,使用mkfs.ext4命令格式化磁盘并指定块大小为4KB:
mkfs.ext4 -b 4096 /dev/sda1

请注意,不同的文件系统类型和工具可能具有不同的语法和选项。请参考相应的文档以了解如何在您的系统上进行格式化和选择块大小。

  • 启用适当的文件系统日志模式:在高写入负载下,选择适当的文件系统日志模式,可以提升写入性能。要启用适当的文件系统日志模式,您需要根据所使用的文件系统类型进行相应的设置。下面是一些常见的文件系统以及启用适当的日志模式的方法:

1)ext4 文件系统:

  • 数据日志模式(data=journal):适用于需要最高数据完整性和可靠性的场景。所有数据和元数据更改都将记录在日志中,确保在系统崩溃时数据的完整性。
mount -o remount,data=journal /dev/sda1
  • 默认日志模式(data=ordered):适用于大多数一般用途的情况。数据更改先写入日志,然后按顺序写入文件系统,以提供一定程度的数据完整性和性能。
mount -o remount,data=ordered /dev/sda1
  • 无日志模式(data=writeback):适用于对性能要求较高的场景。数据更改直接写入文件系统而不写入日志,提供最佳性能但可能会降低数据完整性。
mount -o remount,data=writeback /dev/sda1

2)XFS 文件系统:

  • 日志模式(logbufs):可以通过增加日志缓冲区的数量来提高性能。
mount -o remount,logbufs=8 /dev/sda1

请注意,这只是一些常见文件系统的示例,不同的文件系统可能具有不同的日志模式选项和语法。建议查阅相关文档或官方文档以获取更准确的设置方法。

  • 考虑使用文件系统特定的挂载选项:根据文件系统类型,选择适当的挂载选项以提高性能和稳定性,如前面提到的文件系统优化章节中的选项。

3)RAID和LVM的使用和优化

  • RAID(冗余阵列):使用RAID技术可以将多个磁盘组合成一个逻辑卷,提供数据冗余和性能提升。根据需求选择适当的RAID级别,如RAID 0、RAID 1、RAID 5、RAID 10等。
  • LVM(逻辑卷管理器):LVM允许将多个物理卷组合成一个逻辑卷,提供更灵活的存储管理。合理规划LVM的卷组、卷和逻辑卷大小,以满足存储需求并提高性能。

优化RAID和LVM的使用可以通过以下方式实现:

  • 均衡数据和I/O负载:合理分配数据和I/O负载,避免某些磁盘或卷成为性能瓶颈。
  • 使用高性能硬件:选择高性能的RAID控制器和磁盘驱动器,以提高数据传输速度和响应时间。
  • 定期监测和维护:定期监测RAID和LVM的状态,检查磁盘健康性,及时修复或替换故障的硬件。

通过优化文件系统的选择、调整参数以及合理使用和优化RAID和LVM,可以提升系统的文件系统性能和可靠性,满足应用的存储需求。请根据实际应用场景和需求进行调优,并在实施之前备份相关配置文件以防止意外情况的发生。

尼恩提示:以上内容比较复杂,而且非常重要。如何把以上内容搞清楚? 可以看本文的配套视频《调优圣经,老架构师带实现简历脱胎换骨》。

如果想把调优圣经写入简历,可以找老架构师尼恩提供简历辅导,保证简历金光闪闪、天衣无缝。

网络优化

网络性能对于服务器应用程序的运行至关重要。通过调整网络参数、优化TCP参数以及使用高性能网络协议如RDMA,可以提高服务器的网络性能和响应能力。

本节将介绍如何调整网络参数以提高性能、优化TCP参数以提升网络传输效率,并探讨使用高性能网络协议如RDMA的优势。

1. 调整网络参数以提高网络性能

以下是一些常见的网络参数调整方法:

  • 调整最大文件句柄数:增加最大文件句柄数可以支持更多的并发连接。
sysctl -w fs.file-max=100000
  • 调整最大网络连接数:增加最大网络连接数可以提供更好的并发性能。
sysctl -w net.core.somaxconn=65535
  • 调整网络缓冲区大小:增大网络缓冲区大小可以提高数据传输效率。
sysctl -w net.core.rmem_default=262144sysctl -w net.core.wmem_default=262144sysctl -w net.core.rmem_max=16777216sysctl -w net.core.wmem_max=16777216
  • 启用快速回收(Fast Recovery):快速回收可以加速网络连接的恢复过程。
sysctl -w net.ipv4.tcp_frto=1

2.TCP参数调优

通过调整TCP参数,可以优化网络传输效率和连接的稳定性。以下是一些常见的TCP参数调优方法:

  • 调整TCP窗口大小:增大TCP窗口大小可以提高网络吞吐量。
sysctl -w net.ipv4.tcp_window_scaling=1sysctl -w net.core.netdev_max_backlog=5000sysctl -w net.ipv4.tcp_wmem="4096 87380 16777216"sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216"
  • 开启TCP快速打开(Fast Open):TCP快速打开可以加速连接的建立过程。
sysctl -w net.ipv4.tcp_fastopen=3
  • 调整TCP拥塞控制算法:根据网络状况选择合适的拥塞控制算法。
sysctl -w net.ipv4.tcp_congestion_control=cubic

3. 使用高性能网络协议如RDMA

RDMA(远程直接内存访问)是一种高性能网络协议,可以通过绕过操作系统内核,在主机之间进行高速数据传输。使用RDMA可以显著降低传输延迟和CPU开销,提供更高的网络性能。

要使用RDMA,您需要确保服务器和网络设备支持RDMA技术,并正确配置和管理RDMA相关的软件和硬件。

内存管理和交换空间

有效的内存管理和合理使用交换空间对于系统的性能至关重要。本节将介绍Linux的内存管理机制、调整内存参数以提升性能,并优化交换空间的使用。

1. 了解Linux内存管理机制

了解Linux的内存管理机制对于有效地管理和优化内存至关重要。重要的概念包括:

  • 内存分页:Linux使用分页机制将物理内存划分为固定大小的页面。
  • 页面置换:当物理内存不足时,操作系统将一些页面置换到交换空间中。
  • 缓存和缓冲区:Linux使用文件系统缓存和磁盘缓冲区来提高磁盘I/O性能。
  • 内存回收:Linux会定期回收不再使用的内存页面,并将其释放给其他应用程序使用。

2. 调整内存参数以提升性能

通过调整内存参数,可以优化内存的使用和性能。以下是一些常见的内存参数调优方法:

  • 提高内存分配比例:将更多的内存分配给应用程序,以提高性能。
sysctl -w vm.swappiness=10
  • 增加内存页面回收速度:加快回收不再使用的内存页面的速度,以提高可用内存。
sysctl -w vm.drop_caches=3
  • 调整内存分配策略:根据应用程序的需求,调整内存分配策略以提高性能。
sysctl -w vm.overcommit_memory=1
  • 调整页缓存大小:根据应用程序的特性和需求,调整页缓存的大小。
sysctl -w vm.dirty_ratio=10sysctl -w vm.dirty_background_ratio=5

3. 优化交换空间的使用

交换空间可以作为物理内存的延伸,但过度使用交换空间可能会导致性能下降。以下是一些优化交换空间使用的方法:

  • 调整交换空间大小:根据系统需求和物理内存的大小,合理调整交换空间的大小。
swapoff -add if=/dev/zero of=/swapfile bs=1G count=8mkswap /swapfileswapon /swapfile
  • 避免频繁的交换:通过合理调整内存参数和优化应用程序的内存使用,减少系统对交换空间的依赖。
  • 监控交换空间的使用情况:定期监控交换空间的使用情况,确保没有过度使用或过度依赖交换空间。

请根据实际应用场景和需求进行内存管理和交换空间的优化,并根据系统特点和负载进行适当的调整。注意,内存管理和交换空间优化需要谨慎操作,建议在实施之前备份重要的数据和配置文件。

通过本章的实操内容,我们能够全面了解如何对CentOS上的Linux服务器进行调优。

这些技术和实践将为您提供优化系统性能的关键知识和技能,确保您的应用程序在高负载和大流量情况下保持出色的性能表现。

让我们继续深入学习和实践,提升Linux服务器的性能,为Spring Boot应用程序的顺畅运行打下坚实的基础。

尼恩提示:以上内容比较复杂,而且非常重要。如何把以上内容搞清楚? 可以看本文的配套视频《调优圣经,老架构师带实现简历脱胎换骨》。

如果想把调优圣经写入简历,可以找老架构师尼恩提供简历辅导,保证简历金光闪闪、天衣无缝。

Spring Boot内置Tomcat调优实战

Spring Boot内置的Tomcat作为默认的Servlet容器,为我们提供了方便快捷的Web应用程序开发和部署环境。然而,当应用程序的负载增加或性能需求提高时,我们需要对Tomcat进行调优,以确保系统能够高效稳定地运行。

本章将重点介绍如何调优Spring Boot内置的Tomcat服务器,以提升性能、响应速度和安全性。我们将深入讨论以下关键内容:

  1. 调整Tomcat参数:
    • 调整连接器的参数,如最大连接数、最大线程数,以适应应用程序的负载和并发需求。
    • 配置连接器的超时时间、请求缓冲区等参数,以提高请求的处理效率和吞吐量。
  2. 缓存和会话管理优化:
    • 配置Tomcat的静态资源缓存,以减少对磁盘IO的依赖,提升静态资源的访问速度。
    • 优化会话管理,如使用分布式会话存储、设置会话超时时间等,以提高会话的效率和可靠性。
  3. 安全性优化:
    • 配置Tomcat的安全性特性,如启用SSL/TLS、禁用不安全的加密算法等,以提供安全的通信通道。
  4. 日志管理

调整Spring Boot Tomcat参数

在Spring Boot中,我们可以通过配置文件或代码来调整内置的Tomcat参数,以优化网络性能和并发处理能力。以下是调整Spring Boot Tomcat参数的方法:

1. 调整连接器参数以优化网络性能

连接器是Tomcat用于处理网络请求的组件,通过调整连接器参数可以提高网络性能。在Spring Boot中,我们可以使用server.tomcat前缀的配置属性来调整连接器参数。

application.properties文件中添加以下配置:

# 设置连接器端口server.port=8080# 调整连接器参数server.tomcat.max-connections=200server.tomcat.max-threads=100server.tomcat.connection-timeout=20000

以上配置将设置连接器的最大连接数为200,最大线程数为100,连接超时时间为20秒。

2. 调整线程池参数以提高并发处理能力

Tomcat使用线程池来处理并发请求,适当调整线程池参数可以提高并发处理能力。在Spring Boot中,我们可以使用server.tomcat.threads前缀的配置属性来调整线程池参数。

application.properties文件中添加以下配置:

# 调整线程池参数server.tomcat.threads.max=200server.tomcat.threads.min-spare=20

以上配置将设置线程池的最大线程数为200,最小空闲线程数为20。

请根据实际需求和性能测试结果,灵活调整连接器和线程池参数,以优化Spring Boot内置Tomcat的性能和并发处理能力。

3. 上传文件配置优化

优化Spring Boot的文件上传配置可以提高文件上传的性能和可靠性。以下是一些优化文件上传配置的建议:

  1. 增加最大文件上传大小限制

默认情况下,Spring Boot对文件上传大小进行了限制,通常为1MB。如果需要上传大文件,可以通过配置spring.servlet.multipart.max-file-sizespring.servlet.multipart.max-request-size属性来增加最大文件上传大小限制。例如,设置为10MB:

spring.servlet.multipart.max-file-size=10MBspring.servlet.multipart.max-request-size=10MB
  1. 配置临时文件存储位置

在文件上传过程中,Spring Boot会将文件暂存到临时文件中。您可以通过配置spring.servlet.multipart.location属性来指定临时文件存储的位置。确保存储位置具有足够的可用空间。

spring.servlet.multipart.location=/path/to/temp-directory

缓存和会话管理优化

在Spring Boot中,我们可以通过配置和优化Tomcat的会话管理机制来提高性能和可伸缩性。以下是几个优化Spring Boot Tomcat会话管理的方法:

  • 使用Cookie替代URL重写:默认情况下,Tomcat会通过URL重写(URL Rewriting)的方式将会话ID添加到URL中。这种方式可能导致URL长度过长,影响性能和可读性。我们可以配置Tomcat使用Cookie来存储会话ID,通过以下配置实现:
# 配置使用Cookie来存储会话IDserver.servlet.session.tracking-modes=cookie
  • 配置会话超时时间:会话超时时间定义了会话在一段时间内没有活动后被认为过期。通过合理设置会话超时时间,可以释放不活跃的会话资源,提高系统性能。
# 配置会话超时时间(以分钟为单位)server.servlet.session.timeout=30
  • 使用持久化会话存储:默认情况下,Spring Boot使用基于内存的会话存储机制。在高负载或需要共享会话的场景中,可以考虑将会话信息存储到数据库或缓存中,以实现会话的持久化和共享。

对于使用Redis作为缓存的例子,可以进行以下配置:

  • 引入相关依赖:
  org.springframework.boot  spring-boot-starter-data-redis
  • 配置Redis连接信息:
# Redis连接配置spring.redis.host=localhostspring.redis.port=6379spring.redis.password=
  • 配置会话存储类型为Redis:
# 配置会话存储类型为Redisserver.servlet.session.store-type=redis

通过以上优化会话管理的方法,可以提升Spring Boot内置Tomcat的会话处理性能和可扩展性。根据具体需求和实际场景,选择适合的配置和存储方式来优化会话管理。

Spring Boot Tomcat安全性优化

在Spring Boot中,内置的Tomcat服务器也可以通过一些安全性优化措施来增强应用程序的安全性。以下是几个Spring Boot Tomcat安全性优化的建议:

启用HTTPS可以加密数据传输,确保数据在网络上的安全性。以下是配置Spring Boot Tomcat使用HTTPS的步骤:

  • 获取SSL证书:

获得有效的SSL证书,可以通过购买或使用免费的证书颁发机构(CA)来获得。

  • 配置SSL证书:

将SSL证书配置到应用程序的配置文件中,例如application.properties

# SSL/TLS配置server.ssl.key-store=classpath:keystore.p12server.ssl.key-store-password=your-passwordserver.ssl.key-store-type=PKCS12server.ssl.key-alias=your-alias
  • 启用HTTPS:

在应用程序的配置文件中启用HTTPS:

# 启用HTTPSserver.ssl.enabled=true

Spring Boot Tomcat日志管理

在Spring Boot中,您可以通过配置Tomcat的访问日志(Access Log)来管理和分析访问日志。

使用日志分析工具可以帮助您更好地理解应用程序的行为、发现潜在的故障和性能问题。一些常用的日志分析工具包括ELK Stack(Elasticsearch、Logstash、Kibana)、Splunk、Graylog等。

配置Tomcat的日志输出目录和文件格式,以便与日志分析工具集成,并定期分析日志以进行故障排查和性能优化。

以下是针对Spring Boot Tomcat的访问日志相关配置的优化策略:

  1. 配置访问日志格式

通过配置访问日志的格式,您可以定义日志记录的内容和结构。在Spring Boot中,可以使用server.tomcat.accesslog.pattern属性来配置访问日志的格式。

server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b
  • %h:远程客户端的IP地址或主机名。
  • %l:标识远程逻辑用户名,通常为空格或-表示未知。
  • %u:标识远程用户身份,通常为空格或-表示未知。
  • %t:请求的时间戳,使用Common Log Format的格式。
  • "%r":请求行,包括HTTP方法、请求路径和协议。
  • %s:响应的HTTP状态码。
  • %b:响应中的字节数。

上述示例配置了一个基本的访问日志格式,其中包含了IP地址、远程用户、请求时间、请求行、响应状态和响应字节数。您可以根据需求自定义访问日志的格式。

  1. 配置访问日志位置和文件名

默认情况下,Spring Boot Tomcat的访问日志是输出到控制台的。为了更好地管理和归档访问日志,您可以配置访问日志的位置和文件名。

server.tomcat.accesslog.enabled=trueserver.tomcat.accesslog.directory=/path/to/logsserver.tomcat.accesslog.prefix=access_logserver.tomcat.accesslog.suffix=.log

上述示例将访问日志输出到指定的目录下,文件名为access_log.log。您可以根据需求自定义目录、前缀和后缀。

  1. 配置访问日志的轮转和归档策略

为了控制访问日志文件的大小和数量,可以配置轮转和归档策略。

server.tomcat.accesslog.rotate=trueserver.tomcat.accesslog.max-history=7server.tomcat.accesslog.file-date-format=yyyy-MM-dd

上述示例配置了访问日志的轮转和归档策略。rotate属性设置为true表示启用轮转,max-history属性设置了保留的历史文件数量,file-date-format属性指定了文件名中日期的格式。

通过优化访问日志的格式、位置、文件名以及配置轮转和归档策略,您可以更好地管理和利用Spring Boot Tomcat的访问日志。

这样可以提高日志的可读性、便于故障排查和性能优化,并有效控制日志文件的大小和数量。

尼恩提示:以上内容比较复杂,而且非常重要。如何把以上内容搞清楚? 可以看本文的配套视频《调优圣经,老架构师带实现简历脱胎换骨》。

如果想把调优圣经写入简历,可以找老架构师尼恩提供简历辅导,保证简历金光闪闪、天衣无缝。

小结

通过仔细阅读本文,读者将能够全面了解如何从零基础开始进行Linux服务器和Spring Boot内置Tomcat的调优实战。无论您是初学者还是有一定经验的开发人员,本文提供了丰富的知识和实用的技巧,助您优化系统性能、最大程度地利用资源,并提升应用程序的稳定性和安全性。

在Linux服务器调优方面,我们详细介绍了如何安装和配置监控工具,以实时监测服务器的关键指标,包括CPU、内存、磁盘和网络。通过分析监控数据,您将能够准确识别系统性能瓶颈,为进一步的优化工作奠定基础。

除了监控,我们还探讨了常用的内核参数以及它们的作用。通过调整这些参数,您可以优化系统的各个方面,从文件系统和网络性能到内存管理和交换空间的优化。我们提供了一系列实用的配置和脚本,帮助您轻松实现这些调优策略。

对于Spring Boot内置的Tomcat调优,我们还深入研究了如何调整Tomcat的参数以优化性能。通过调整连接器参数和线程池参数,您可以提高Tomcat的网络性能和并发处理能力,从而更好地应对高流量的场景。

此外,我们还强调了缓存和会话管理的优化重要性。通过使用缓存来提高访问速度,并配置Tomcat的会话管理机制,您可以有效管理会话并提升应用程序的性能。对于会话共享问题,我们提供了使用分布式缓存的解决方案,以确保多个Tomcat实例之间的会话共享。

在安全性优化方面,我们详细介绍了如何配置SSL/TLS加密通信,以保障数据传输的安全性。此外,我们强调了使用安全的密码存储策略的重要性,并提供了一些防止常见安全漏洞和攻击的建议,以确保应用程序的安全性。

最后,我们讨论了日志管理的重要性,并提供了一些实用的建议。通过配置适当的日志级别和格式,您可以方便地追踪和分析应用程序的运行情况,从而更好地进行故障排查和性能优化。我们还强调了日志轮转和归档策略的重要性,以便有效地管理日志文件并节省存储空间。

通过学习本文提供的知识和技巧,读者将能够全面掌握Linux服务器和Spring Boot内置Tomcat的调优实战。这些调优策略和最佳实践将帮助您提升系统性能、优化资源利用,并增强应用程序的稳定性和安全性。无论您是系统管理员、开发人员还是运维工程师,本文都为您提供了宝贵的指导和实用工具,助您在实际工作中取得优异的成果。

《Java 调优圣经》迭代计划

尼恩团队的所有文章和PDF,都是 持续迭代的模式, 最新版本永远是最全的。

尼恩团队结合资深架构经验和行业案例,给大家梳理一个系列的《Java 调优圣经PDF,包括本文在内规划的6个部分:

(1) 调优圣经1:零基础精通Jmeter分布式压测,10Wqps+压测实操 (已经完成)

(2) 调优圣经2:从70s到20ms,一次3500倍性能优化实战,方案人人可用 (已经完成)

(3) 调优圣经3:如何做mysql调优?绝命7招让慢SQL调优100倍,实现你的Mysql调优自由 (已经完成)

(4) 调优圣经4:SpringBoot假死,十万火急,怎么救火? (已经完成)

(5) 调优圣经5:零基础精通JVM调优实操,实现JVM自由 (已经完成)

(6) 调优圣经6:零基础精通Linux、Tomcat调优实操,实现基础设施调优自由(本文)

以上的多篇文章,后续将陆续在 技术自由圈 公众号发布。 完整的《Java 调优圣经》PDF,可以在文末【技术自由圈】找尼恩获取

同时如果通过图文看不懂的地方,也可以看 尼恩团队为《Java 调优圣经》 录制的配套实操视频。

如果不知道怎么把《Java 调优圣经》 写入简历,也可以找尼恩团队进行简历的优化,保证优化之后金光闪闪、脱胎换骨。

技术自由的实现路径 PDF:

实现你的 响应式 自由:

《响应式圣经:10W字,实现Spring响应式编程自由》

这是老版本 《Flux、Mono、Reactor 实战(史上最全)》

实现你的 spring cloud 自由:

《Spring cloud Alibaba 学习圣经》 PDF

《分库分表 Sharding-JDBC 底层原理、核心实战(史上最全)》

《一文搞定:SpringBoot、SLF4j、Log4j、Logback、Netty之间混乱关系(史上最全)》

实现你的 linux 自由:

《Linux命令大全:2W多字,一次实现Linux自由》

实现你的 网络 自由:

《TCP协议详解 (史上最全)》

《网络三张表:ARP表, MAC表, 路由表,实现你的网络自由!!》

实现你的 分布式锁 自由:

《Redis分布式锁(图解 - 秒懂 - 史上最全)》

《Zookeeper 分布式锁 - 图解 - 秒懂》

实现你的 王者组件 自由:

《队列之王: Disruptor 原理、架构、源码 一文穿透》

《缓存之王:Caffeine 源码、架构、原理(史上最全,10W字 超级长文)》

《缓存之王:Caffeine 的使用(史上最全)》

《Java Agent 探针、字节码增强 ByteBuddy(史上最全)》

实现你的 面试题 自由:

4000页《尼恩Java面试宝典 》 40个专题

获取11个技术圣经PDF:

关键词: