<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Linux on Chanyeol Dev</title>
    <link>https://chanyeols.com/categories/linux/</link>
    <description>Recent content in Linux on Chanyeol Dev</description>
    <generator>Hugo</generator>
    <language>ko-kr</language>
    <lastBuildDate>Mon, 04 May 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://chanyeols.com/categories/linux/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>초보자도 쉽게 따라하는 Linux Tomcat WAR 배포 튜토리얼</title>
      <link>https://chanyeols.com/posts/linux-tomcat-war-deployment-guide/</link>
      <pubDate>Mon, 04 May 2026 00:00:00 +0000</pubDate>
      <guid>https://chanyeols.com/posts/linux-tomcat-war-deployment-guide/</guid>
      <description>리눅스 서버에 Tomcat 설치부터 WAR 배포까지의 전체 과정을 단계별로 설명하는 튜토리얼. 트러블슈팅 팁 포함</description>
      <content:encoded><![CDATA[<h2 id="초보자도-쉽게-따라하는-linux-tomcat-war-배포-튜토리얼">초보자도 쉽게 따라하는 Linux Tomcat WAR 배포 튜토리얼</h2>
<p><img alt="초보자도 쉽게 따라하는 Linux Tomcat WAR 배포 튜토리얼" loading="lazy" src="/images/linux-tomcat-war-deployment-guide-body.jpg"></p>
<p>리눅스 서버에 Apache Tomcat을 설치하고 WAR 파일을 배포하는 전체 과정을 단계별로 설명합니다. 이 튜토리얼은 Ubuntu 22.04와 CentOS 8 환경에서 Java 17과 Tomcat 10.1을 기준으로 작성되었으며, 실제 동작하는 코드 예제와 트러블슈팅 팁을 포함합니다. 초보 개발자도 쉽게 따라할 수 있도록 구성되었습니다.</p>
<h2 id="1-튜토리얼-개요">1. 튜토리얼 개요</h2>
<p>Apache Tomcat은 자바 기반의 웹 애플리케이션을 호스팅하기 위한 오픈소스 서블릿 컨테이너입니다. 이 가이드에서는 Tomcat 10.1 버전을 사용하여 WAR 파일을 배포하는 방법을 다룹니다. 지원 OS는 Ubuntu 22.04와 CentOS 8이며, 두 배포판 모두에서 테스트를 완료했습니다. 전체 프로세스는 다음과 같은 단계로 구성됩니다:</p>
<ol>
<li><strong>사전 준비</strong>: Java 설치 확인, 방화벽 설정, WAR 파일 준비</li>
<li><strong>Tomcat 설치</strong>: 패키지 관리자 사용 vs 바이너리 설치 방법 비교</li>
<li><strong>서비스 관리</strong>: systemd를 이용한 서비스 등록 및 자동 실행 설정</li>
<li><strong>WAR 배포</strong>: webapps 디렉토리에 WAR 파일 복사 및 자동 배포 확인</li>
<li><strong>문제 해결</strong>: 404 에러, Java 버전 문제, 보안 정책 조정</li>
<li><strong>고급 설정</strong>: 모니터링 및 추가 학습 자료 제공</li>
</ol>
<blockquote>
<p><strong>참고</strong>: 공식 문서에서는 <a href="https://tomcat.apache.org/download-10.cgi">Tomcat 10.1 다운로드 페이지</a>에서 최신 버전을 확인할 수 있습니다. 또한 <a href="https://docs.oracle.com/en/java/javase/17/install/">Oracle Java 17 설치 가이드</a>를 참고하면 Java 설치에 도움이 됩니다.</p>
</blockquote>
<h2 id="2-사전-준비-사항">2. 사전 준비 사항</h2>
<h3 id="21-java-17-설치-확인">2.1 Java 17+ 설치 확인</h3>
<p>Tomcat 10.1은 Java 17 이상을 필수로 요구합니다. 다음 명령어로 Java 설치 상태를 확인하세요:</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>java -version
</span></span></code></pre></div><p>출력 결과가 <code>17.x.x</code>로 시작하지 않으면 Java 17을 설치해야 합니다. Ubuntu에서는 다음 명령어로 설치할 수 있습니다:</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo apt update
</span></span><span style="display:flex;"><span>sudo apt install openjdk-17-jdk -y
</span></span></code></pre></div><p>CentOS에서는:</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo yum install java-17-openjdk-devel -y
</span></span></code></pre></div><p>설치 후 <code>JAVA_HOME</code> 환경 변수를 설정해야 합니다. Ubuntu/CentOS 공통 설정 방법:</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>echo <span style="color:#a5d6ff">&#39;export JAVA_HOME=$(readlink -f /usr/bin/java | sed &#34;s:/bin/java::&#34;)&#39;</span> &gt;&gt; ~/.bashrc
</span></span><span style="display:flex;"><span>echo <span style="color:#a5d6ff">&#39;export PATH=$JAVA_HOME/bin:$PATH&#39;</span> &gt;&gt; ~/.bashrc
</span></span><span style="display:flex;"><span>source ~/.bashrc
</span></span></code></pre></div><h3 id="22-방화벽-설정">2.2 방화벽 설정</h3>
<p>Tomcat 기본 포트는 8080입니다. SSH(22)와 Tomcat(8080) 포트를 열어주세요:</p>
<ul>
<li>
<p><strong>Ubuntu</strong>:</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo ufw allow 22/tcp
</span></span><span style="display:flex;"><span>sudo ufw allow 8080/tcp
</span></span></code></pre></div></li>
<li>
<p><strong>CentOS</strong>:</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo firewall-cmd --permanent --add-port<span style="color:#ff7b72;font-weight:bold">=</span>22/tcp
</span></span><span style="display:flex;"><span>sudo firewall-cmd --permanent --add-port<span style="color:#ff7b72;font-weight:bold">=</span>8080/tcp
</span></span><span style="display:flex;"><span>sudo firewall-cmd --reload
</span></span></code></pre></div></li>
</ul>
<h3 id="23-war-파일-준비">2.3 WAR 파일 준비</h3>
<p>샘플 WAR 파일이 없다면 Spring Boot 프로젝트를 생성해 테스트용 WAR를 만들 수 있습니다. 다음 <code>pom.xml</code>을 사용하세요:</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-xml" data-lang="xml"><span style="display:flex;"><span><span style="color:#7ee787">&lt;project</span> xmlns=<span style="color:#a5d6ff">&#34;http://maven.apache.org/POM/4.0.0&#34;</span><span style="color:#7ee787">&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#7ee787">&lt;modelVersion&gt;</span>4.0.0<span style="color:#7ee787">&lt;/modelVersion&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#7ee787">&lt;groupId&gt;</span>com.example<span style="color:#7ee787">&lt;/groupId&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#7ee787">&lt;artifactId&gt;</span>demo<span style="color:#7ee787">&lt;/artifactId&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#7ee787">&lt;version&gt;</span>0.0.1-SNAPSHOT<span style="color:#7ee787">&lt;/version&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#7ee787">&lt;packaging&gt;</span>war<span style="color:#7ee787">&lt;/packaging&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#7ee787">&lt;parent&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#7ee787">&lt;groupId&gt;</span>org.springframework.boot<span style="color:#7ee787">&lt;/groupId&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#7ee787">&lt;artifactId&gt;</span>spring-boot-starter-parent<span style="color:#7ee787">&lt;/artifactId&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#7ee787">&lt;version&gt;</span>3.1.5<span style="color:#7ee787">&lt;/version&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#7ee787">&lt;relativePath/&gt;</span> <span style="color:#8b949e;font-style:italic">&lt;!-- lookup parent from repository --&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#7ee787">&lt;/parent&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#7ee787">&lt;dependencies&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#7ee787">&lt;dependency&gt;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#7ee787">&lt;groupId&gt;</span>org.springframework.boot<span style="color:#7ee787">&lt;/groupId&gt;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#7ee787">&lt;artifactId&gt;</span>spring-boot-starter-web<span style="color:#7ee787">&lt;/artifactId&gt;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#7ee787">&lt;exclusions&gt;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#7ee787">&lt;exclusion&gt;</span>
</span></span><span style="display:flex;"><span>          <span style="color:#7ee787">&lt;groupId&gt;</span>org.springframework.boot<span style="color:#7ee787">&lt;/groupId&gt;</span>
</span></span><span style="display:flex;"><span>          <span style="color:#7ee787">&lt;artifactId&gt;</span>spring-boot-starter-tomcat<span style="color:#7ee787">&lt;/artifactId&gt;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#7ee787">&lt;/exclusion&gt;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#7ee787">&lt;/exclusions&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#7ee787">&lt;/dependency&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#7ee787">&lt;dependency&gt;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#7ee787">&lt;groupId&gt;</span>org.springframework.boot<span style="color:#7ee787">&lt;/groupId&gt;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#7ee787">&lt;artifactId&gt;</span>spring-boot-starter-tomcat<span style="color:#7ee787">&lt;/artifactId&gt;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#7ee787">&lt;scope&gt;</span>provided<span style="color:#7ee787">&lt;/scope&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#7ee787">&lt;/dependency&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#7ee787">&lt;dependency&gt;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#7ee787">&lt;groupId&gt;</span>jakarta.servlet<span style="color:#7ee787">&lt;/groupId&gt;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#7ee787">&lt;artifactId&gt;</span>jakarta.servlet-api<span style="color:#7ee787">&lt;/artifactId&gt;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#7ee787">&lt;version&gt;</span>6.0.0<span style="color:#7ee787">&lt;/version&gt;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#7ee787">&lt;scope&gt;</span>provided<span style="color:#7ee787">&lt;/scope&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#7ee787">&lt;/dependency&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#7ee787">&lt;/dependencies&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#7ee787">&lt;build&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#7ee787">&lt;plugins&gt;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#7ee787">&lt;plugin&gt;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#7ee787">&lt;groupId&gt;</span>org.springframework.boot<span style="color:#7ee787">&lt;/groupId&gt;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#7ee787">&lt;artifactId&gt;</span>spring-boot-maven-plugin<span style="color:#7ee787">&lt;/artifactId&gt;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#7ee787">&lt;/plugin&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#7ee787">&lt;/plugins&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#7ee787">&lt;/build&gt;</span>
</span></span><span style="display:flex;"><span><span style="color:#7ee787">&lt;/project&gt;</span>
</span></span></code></pre></div><p>그리고 간단한 컨트롤러 클래스를 작성하세요:</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#ff7b72">package</span><span style="color:#6e7681"> </span><span style="color:#ff7b72">com.example.demo</span>;<span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#ff7b72">import</span><span style="color:#6e7681"> </span><span style="color:#ff7b72">org.springframework.boot.web.servlet.support.SpringBootServletInitializer</span>;<span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#ff7b72">import</span><span style="color:#6e7681"> </span><span style="color:#ff7b72">org.springframework.boot.builder.SpringApplicationBuilder</span>;<span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#ff7b72">import</span><span style="color:#6e7681"> </span><span style="color:#ff7b72">org.springframework.stereotype.Component</span>;<span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#ff7b72">import</span><span style="color:#6e7681"> </span><span style="color:#ff7b72">org.springframework.web.bind.annotation.*</span>;<span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#d2a8ff;font-weight:bold">@RestController</span><span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#ff7b72">public</span><span style="color:#6e7681"> </span><span style="color:#ff7b72">class</span> <span style="color:#f0883e;font-weight:bold">HelloController</span><span style="color:#6e7681"> </span><span style="color:#ff7b72">extends</span><span style="color:#6e7681"> </span>SpringBootServletInitializer<span style="color:#6e7681"> </span>{<span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">    </span><span style="color:#d2a8ff;font-weight:bold">@Override</span><span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">    </span><span style="color:#ff7b72">protected</span><span style="color:#6e7681"> </span>SpringApplicationBuilder<span style="color:#6e7681"> </span><span style="color:#d2a8ff;font-weight:bold">configure</span>(SpringApplicationBuilder<span style="color:#6e7681"> </span>application)<span style="color:#6e7681"> </span>{<span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">        </span><span style="color:#ff7b72">return</span><span style="color:#6e7681"> </span>application.sources(HelloController.class);<span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">    </span>}<span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">    
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">    </span><span style="color:#d2a8ff;font-weight:bold">@GetMapping</span>(<span style="color:#a5d6ff">&#34;/&#34;</span>)<span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">    </span><span style="color:#ff7b72">public</span><span style="color:#6e7681"> </span>String<span style="color:#6e7681"> </span><span style="color:#d2a8ff;font-weight:bold">home</span>()<span style="color:#6e7681"> </span>{<span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">        </span><span style="color:#ff7b72">return</span><span style="color:#6e7681"> </span><span style="color:#a5d6ff">&#34;Hello from Tomcat!&#34;</span>;<span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">    </span>}<span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span>}<span style="color:#6e7681">
</span></span></span></code></pre></div><p>Maven으로 WAR를 빌드하려면:</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>mvn clean package
</span></span></code></pre></div><p>생성된 WAR 파일은 <code>target/demo-0.0.1-SNAPSHOT.war</code>에 위치합니다.</p>
<h2 id="3-단계별-설치-및-배포">3. 단계별 설치 및 배포</h2>
<h3 id="31-tomcat-설치-방법-비교">3.1 Tomcat 설치 방법 비교</h3>
<p>Tomcat 설치에는 두 가지 주요 방법이 있습니다:</p>
<ol>
<li>
<p><strong>패키지 관리자 사용 (apt/yum)</strong></p>
<ul>
<li>장점: 시스템 통합이 용이</li>
<li>단점: 최신 버전 지원이 느림</li>
<li>Ubuntu:
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo apt install tomcat10 -y
</span></span></code></pre></div></li>
<li>CentOS:
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo yum install tomcat -y
</span></span></code></pre></div></li>
</ul>
</li>
<li>
<p><strong>바이너리 설치 (권장)</strong></p>
<ul>
<li>장점: 최신 버전 설치 가능</li>
<li>단점: 수동 설정 필요</li>
<li>공식 사이트에서 압축 해제:
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>cd /opt
</span></span><span style="display:flex;"><span>sudo wget https://downloads.apache.org/tomcat/tomcat-10/v10.1.12/bin/apache-tomcat-10.1.12.tar.gz
</span></span><span style="display:flex;"><span>sudo tar -xzvf apache-tomcat-10.1.12.tar.gz
</span></span><span style="display:flex;"><span>sudo ln -s apache-tomcat-10.1.12 tomcat
</span></span></code></pre></div></li>
</ul>
</li>
</ol>
<blockquote>
<p><strong>팁</strong>: 프로덕션 환경에서는 바이너리 설치가 권장됩니다. 패키지 관리자는 때로는 오래된 버전을 포함할 수 있기 때문입니다.</p>
</blockquote>
<h3 id="32-systemd-서비스-등록">3.2 systemd 서비스 등록</h3>
<p>Tomcat을 백그라운드 서비스로 실행하려면 systemd를 설정해야 합니다. <code>/etc/systemd/system/tomcat.service</code> 파일을 생성하세요:</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-ini" data-lang="ini"><span style="display:flex;"><span><span style="color:#ff7b72">[Unit]</span>
</span></span><span style="display:flex;"><span>Description<span style="color:#ff7b72;font-weight:bold">=</span><span style="color:#a5d6ff">Apache Tomcat 10 Web Application Container</span>
</span></span><span style="display:flex;"><span>After<span style="color:#ff7b72;font-weight:bold">=</span><span style="color:#a5d6ff">network.target</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">[Service]</span>
</span></span><span style="display:flex;"><span>Type<span style="color:#ff7b72;font-weight:bold">=</span><span style="color:#a5d6ff">forking</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Environment<span style="color:#ff7b72;font-weight:bold">=</span><span style="color:#a5d6ff">CATALINA_PID=/opt/tomcat/temp/tomcat.pid</span>
</span></span><span style="display:flex;"><span>Environment<span style="color:#ff7b72;font-weight:bold">=</span><span style="color:#a5d6ff">CATALINA_HOME=/opt/tomcat</span>
</span></span><span style="display:flex;"><span>Environment<span style="color:#ff7b72;font-weight:bold">=</span><span style="color:#a5d6ff">CATALINA_BASE=/opt/tomcat</span>
</span></span><span style="display:flex;"><span>Environment<span style="color:#ff7b72;font-weight:bold">=</span><span style="color:#a5d6ff">&#39;JAVA_HOME=/usr/lib/jvm/java-17-openjdk&#39;</span>
</span></span><span style="display:flex;"><span>Environment<span style="color:#ff7b72;font-weight:bold">=</span><span style="color:#a5d6ff">&#39;JAVA_OPTS=-Djava.security.egd=file:/dev/./urandom -Djava.awt.headless=true&#39;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>ExecStart<span style="color:#ff7b72;font-weight:bold">=</span><span style="color:#a5d6ff">/opt/tomcat/bin/startup.sh</span>
</span></span><span style="display:flex;"><span>ExecStop<span style="color:#ff7b72;font-weight:bold">=</span><span style="color:#a5d6ff">/opt/tomcat/bin/shutdown.sh</span>
</span></span><span style="display:flex;"><span>ExecReload<span style="color:#ff7b72;font-weight:bold">=</span><span style="color:#a5d6ff">/opt/tomcat/bin/shutdown.sh ; /opt/tomcat/bin/startup.sh</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>User<span style="color:#ff7b72;font-weight:bold">=</span><span style="color:#a5d6ff">tomcat</span>
</span></span><span style="display:flex;"><span>Group<span style="color:#ff7b72;font-weight:bold">=</span><span style="color:#a5d6ff">tomcat</span>
</span></span><span style="display:flex;"><span>UMask<span style="color:#ff7b72;font-weight:bold">=</span><span style="color:#a5d6ff">0007</span>
</span></span><span style="display:flex;"><span>RestartSec<span style="color:#ff7b72;font-weight:bold">=</span><span style="color:#a5d6ff">10</span>
</span></span><span style="display:flex;"><span>Restart<span style="color:#ff7b72;font-weight:bold">=</span><span style="color:#a5d6ff">always</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">[Install]</span>
</span></span><span style="display:flex;"><span>WantedBy<span style="color:#ff7b72;font-weight:bold">=</span><span style="color:#a5d6ff">multi-user.target</span>
</span></span></code></pre></div><p>서비스 활성화 및 시작:</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo systemctl daemon-reload
</span></span><span style="display:flex;"><span>sudo systemctl enable tomcat
</span></span><span style="display:flex;"><span>sudo systemctl start tomcat
</span></span></code></pre></div><h3 id="33-war-파일-배포">3.3 WAR 파일 배포</h3>
<p>WAR 파일은 Tomcat의 <code>webapps</code> 디렉토리에 복사하면 자동으로 배포됩니다:</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>cp demo-0.0.1-SNAPSHOT.war /opt/tomcat/webapps/
</span></span></code></pre></div><p>배포 상태를 확인하려면 로그 파일을 확인하세요:</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>cat /opt/tomcat/logs/catalina.out
</span></span></code></pre></div><p>브라우저에서 <code>http://[서버IP]:8080/demo</code>로 접속하여 &ldquo;Hello from Tomcat!&rdquo; 메시지가 표시되는지 확인하세요.</p>
<h2 id="4-트러블슈팅">4. 트러블슈팅</h2>
<h3 id="41-404-에러-해결">4.1 404 에러 해결</h3>
<p>WAR 파일이 배포되었지만 404 에러가 발생한다면 다음을 확인하세요:</p>
<ol>
<li>
<p><strong>로그 확인</strong>:</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>tail -f /opt/tomcat/logs/catalina.out
</span></span></code></pre></div><p>에러 메시지가 있는지 확인합니다.</p>
</li>
<li>
<p><strong>컨텍스트 패스 확인</strong>: WAR 파일 이름이 <code>demo.war</code>라면 접근 주소는 <code>http://[서버IP]:8080/demo</code>입니다.</p>
</li>
<li>
<p><strong>서버 재시작</strong>:</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo systemctl restart tomcat
</span></span></code></pre></div></li>
</ol>
<h3 id="42-java-버전-불일치-문제">4.2 Java 버전 불일치 문제</h3>
<p>Tomcat 10.1은 Java 8 이상을 지원하지만, 최신 기능을 사용하려면 Java 17이 필요합니다. 다음 명령어로 사용 중인 Java 버전을 확인하세요:</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>/opt/tomcat/bin/version.sh
</span></span></code></pre></div><p>만약 잘못된 Java 버전이 사용된다면 <code>CATALINA_OPTS</code>에 Java 경로를 명시적으로 지정하세요:</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>export <span style="color:#79c0ff">CATALINA_OPTS</span><span style="color:#ff7b72;font-weight:bold">=</span><span style="color:#a5d6ff">&#34;</span><span style="color:#79c0ff">$CATALINA_OPTS</span><span style="color:#a5d6ff"> -Djava.home=/usr/lib/jvm/java-17-openjdk&#34;</span>
</span></span></code></pre></div><h3 id="43-selinuxapparmor-보안-정책">4.3 SELinux/AppArmor 보안 정책</h3>
<p>SELinux나 AppArmor가 활성화된 환경에서는 Tomcat이 파일에 접근하지 못할 수 있습니다. Ubuntu에서는 AppArmor를 일시적으로 비활성화해 테스트할 수 있습니다:</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo systemctl stop apparmor
</span></span></code></pre></div><p>CentOS에서 SELinux 모드 확인:</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>getenforce
</span></span></code></pre></div><p>SELinux를 일시적으로 Permissive 모드로 전환:</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo setenforce <span style="color:#a5d6ff">0</span>
</span></span></code></pre></div><p>영구적으로 비활성화하려면 <code>/etc/selinux/config</code> 파일을 편집하세요:</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-ini" data-lang="ini"><span style="display:flex;"><span>SELINUX<span style="color:#ff7b72;font-weight:bold">=</span><span style="color:#a5d6ff">disabled</span>
</span></span></code></pre></div><h2 id="5-마치며">5. 마치며</h2>
<p>이 튜토리얼에서는 Linux 서버에 Tomcat을 설치하고 WAR 파일을 배포하는 전체 과정을 다뤘습니다. 핵심 내용을 요약하면 다음과 같습니다:</p>
<ol>
<li>Tomcat 10.1 설치에는 바이너리 방식이 최신 버전 사용에 유리합니다.</li>
<li>WAR 파일은 webapps 디렉토리에 복사만으로 자동 배포됩니다.</li>
<li>트러블슈팅 시 로그 파일과 보안 정책을 반드시 확인해야 합니다.</li>
</ol>
<p>추가로 학습할 자료:</p>
<ul>
<li><a href="https://tomcat.apache.org/tomcat-10.0-doc/index.html">Tomcat 공식 문서</a></li>
<li><a href="https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#building-an-executable-war-file">Spring Boot WAR 배포 가이드</a></li>
</ul>
<p>모니터링 시스템 구축을 원한다면 JMXTrans와 Grafana를 연동하는 방법을 고려해보세요. 이는 서버 리소스 사용량과 애플리케이션 성능을 실시간으로 모니터링할 수 있게 해줍니다.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Linux 성능 튜닝 트러블슈팅: top, iostat, vmstat로 문제 해결</title>
      <link>https://chanyeols.com/posts/linux-server-performance-monitoring-troubleshooting-with-top-iostat-vmstat/</link>
      <pubDate>Thu, 23 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://chanyeols.com/posts/linux-server-performance-monitoring-troubleshooting-with-top-iostat-vmstat/</guid>
      <description>linux-server-performance-monitoring-troubleshooting-with-top-iostat-vmstat</description>
      <content:encoded><![CDATA[<h2 id="linux-성능-튜닝-트러블슈팅-top-iostat-vmstat로-문제-해결">Linux 성능 튜닝 트러블슈팅: top, iostat, vmstat로 문제 해결</h2>
<p>Linux 서버 성능 병목 현상을 해결하는 것은 시스템 관리자와 DevOps 엔지니어의 핵심 역량입니다. <strong>top</strong>, <strong>iostat</strong>, <strong>vmstat</strong>과 같은 기본 제공 도구를 활용하면 CPU, 메모리, 디스크 I/O, 페이징 등 다양한 지표에서 발생하는 문제를 정확히 진단할 수 있습니다. 이 가이드에서는 각 도구의 기본 사용법부터 실제 트러블슈팅 사례까지 단계별로 설명합니다.</p>
<h2 id="1-linux-성능-모니터링-도구-기본-사용법">1. Linux 성능 모니터링 도구 기본 사용법</h2>
<h3 id="11-top-실시간-cpu메모리-모니터링">1.1 top: 실시간 CPU/메모리 모니터링</h3>
<p><code>top</code>은 Linux 시스템의 실시간 상태를 확인하는 가장 기본적인 도구입니다. CPU 사용률, 메모리 사용량, 실행 중인 프로세스 목록 등을 1초 단위로 업데이트하여 보여줍니다.</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># 기본 top 실행 (1초 간격)</span>
</span></span><span style="display:flex;"><span>top
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># 상세 프로세스 정보 확인 (커널 스레드 포함)</span>
</span></span><span style="display:flex;"><span>top -H
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># CPU 사용률 높은 프로세스 상위 10개 출력</span>
</span></span><span style="display:flex;"><span>ps auxf --sort<span style="color:#ff7b72;font-weight:bold">=</span>-%cpu | head -n <span style="color:#a5d6ff">12</span>
</span></span></code></pre></div><blockquote>
<p><strong>Tip</strong>: <code>top</code> 실행 후 <code>1</code> 키를 눌러 CPU 코어별 사용률을 확인할 수 있습니다. <code>shift + p</code>는 CPU 사용률 기준 정렬, <code>shift + m</code>은 메모리 사용률 기준 정렬입니다.</p>
</blockquote>
<h3 id="12-iostat-디스크-io-병목-진단">1.2 iostat: 디스크 I/O 병목 진단</h3>
<p><code>iostat</code>(I/O statistics)는 디스크 장치의 읽기/쓰기 성능, 대기 시간, 처리량 등을 모니터링합니다. <code>sysstat</code> 패키지에 포함되어 있으며, CentOS/RHEL에서는 <code>yum install sysstat</code>으로 설치 가능합니다.</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># 1초 간격으로 5회 디스크 I/O 통계 출력</span>
</span></span><span style="display:flex;"><span>iostat -xz <span style="color:#a5d6ff">1</span> <span style="color:#a5d6ff">5</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># 특정 디스크 장치(sda) 모니터링</span>
</span></span><span style="display:flex;"><span>iostat -x sda <span style="color:#a5d6ff">1</span> <span style="color:#a5d6ff">10</span>
</span></span></code></pre></div><blockquote>
<p><strong>주의</strong>: <code>iostat</code>의 <code>await</code>(평균 I/O 처리 시간) 값이 10ms 이상이면 디스크 병목 가능성이 높습니다. <code>avgqu-sz</code>(평균 요청 큐 크기)가 1을 초과하면 I/O 대기열이 쌓이기 시작한다는 신호입니다.</p>
</blockquote>
<h3 id="13-vmstat-시스템-전체-상태-종합-분석">1.3 vmstat: 시스템 전체 상태 종합 분석</h3>
<p><code>vmstat</code>(Virtual Memory Statistics)는 CPU, 메모리, 페이징, 블록 I/O, 트랩, 디스크 등 시스템 전반의 상태를 한 번에 확인할 수 있는 강력한 도구입니다.</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># 1초 간격으로 10회 시스템 통계 출력</span>
</span></span><span style="display:flex;"><span>vmstat <span style="color:#a5d6ff">1</span> <span style="color:#a5d6ff">10</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># 5초 간격으로 20회 상세 출력 (disk stats 포함)</span>
</span></span><span style="display:flex;"><span>vmstat -d <span style="color:#a5d6ff">5</span> <span style="color:#a5d6ff">20</span>
</span></span></code></pre></div><blockquote>
<p><strong>중요 지표</strong>:</p>
<ul>
<li><code>us</code>(user), <code>sy</code>(system), <code>id</code>(idle): CPU 사용 시간 비율</li>
<li><code>si</code>(swap in), <code>so</code>(swap out): 스와핑 발생 여부</li>
<li><code>cs</code>(context switch): 컨텍스트 스위칭 빈도 (10,000 이상이면 문제 가능성)</li>
</ul>
</blockquote>
<h2 id="2-cpu-과부하-문제-해결-방법">2. CPU 과부하 문제 해결 방법</h2>
<h3 id="21-top으로-cpu-집약적-프로세스-식별">2.1 top으로 CPU 집약적 프로세스 식별</h3>
<p>CPU 사용률이 80% 이상 지속적으로 높게 나타난다면, <code>top</code>을 통해 문제 프로세스를 식별해야 합니다.</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># 명령행 인자까지 표시 (CPU 사용률 높은 프로세스 확인)</span>
</span></span><span style="display:flex;"><span>top -c
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># CPU 사용률 기준 상위 5개 프로세스</span>
</span></span><span style="display:flex;"><span>ps -eo pid,comm,%cpu --sort<span style="color:#ff7b72;font-weight:bold">=</span>-%cpu | head -n <span style="color:#a5d6ff">6</span>
</span></span></code></pre></div><blockquote>
<p><strong>예시 시나리오</strong>: 특정 Python 프로세스가 95% CPU를 점유하는 경우, 코드 내의 무한 루프 또는 비효율적인 알고리즘이 원인일 수 있습니다.</p>
</blockquote>
<h3 id="22-iostat으로-디스크-관련-cpu-지연-확인">2.2 iostat으로 디스크 관련 CPU 지연 확인</h3>
<p>CPU 사용률은 낮지만 시스템이 느리게 반응할 경우, 디스크 I/O 대기 시간으로 인한 CPU 지연이 발생할 수 있습니다.</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># 확장된 디스크 통계 출력 (avgqu-sz, await 확인)</span>
</span></span><span style="display:flex;"><span>iostat -xz <span style="color:#a5d6ff">1</span>
</span></span></code></pre></div><blockquote>
<p><code>await</code> 값이 20ms 이상이면 스토리지 성능 문제를 의심해야 합니다. SSD 기준 일반적으로 0.1ms 미만, HDD는 5~10ms 사이가 정상입니다.</p>
</blockquote>
<h3 id="23-vmstat으로-컨텍스트-스위칭-분석">2.3 vmstat으로 컨텍스트 스위칭 분석</h3>
<p>높은 컨텍스트 스위칭(<code>cs</code>) 비율은 스레드 경합 또는 과도한 멀티태스킹을 나타냅니다.</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># 1초 간격으로 컨텍스트 스위칭 모니터링</span>
</span></span><span style="display:flex;"><span>vmstat <span style="color:#a5d6ff">1</span> <span style="color:#a5d6ff">5</span>
</span></span></code></pre></div><blockquote>
<p><code>cs</code> 값이 CPU 코어당 초당 2,000회를 초과하면 성능 저하가 발생할 수 있습니다. 예를 들어 4코어 시스템에서 <code>cs</code> 값이 10,000 이상이면 조사가 필요합니다.</p>
</blockquote>
<h2 id="3-메모리-및-디스크-병목-트러블슈팅">3. 메모리 및 디스크 병목 트러블슈팅</h2>
<h3 id="31-메모리-부족-현상-감지">3.1 메모리 부족 현상 감지</h3>
<p><code>vmstat</code>에서 <code>si</code>/<code>so</code> 값이 0보다 크면 스와핑이 발생하고 있음을 의미합니다.</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># 메모리 및 스와핑 모니터링</span>
</span></span><span style="display:flex;"><span>vmstat -s
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># 실시간 메모리 사용량 확인</span>
</span></span><span style="display:flex;"><span>free -m
</span></span></code></pre></div><blockquote>
<p>스와핑이 지속되면 애플리케이션 성능이 급격히 저하됩니다. <code>swapiness</code> 값을 조정하여 스와핑을 최소화할 수 있습니다.</p>
</blockquote>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># swapiness 값 확인 및 조정</span>
</span></span><span style="display:flex;"><span>cat /proc/sys/vm/swappiness
</span></span><span style="display:flex;"><span>sysctl vm.swappiness<span style="color:#ff7b72;font-weight:bold">=</span><span style="color:#a5d6ff">10</span>
</span></span></code></pre></div><h3 id="32-디스크-io-병목-해결">3.2 디스크 I/O 병목 해결</h3>
<p><code>iostat</code>에서 <code>%util</code>(디스크 사용률)이 100%에 가까우면 디스크 대역폭이 포화 상태임을 의미합니다.</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># 디스크 사용률 모니터링</span>
</span></span><span style="display:flex;"><span>iostat -d <span style="color:#a5d6ff">1</span> <span style="color:#a5d6ff">5</span>
</span></span></code></pre></div><blockquote>
<p><strong>해결 방안</strong>:</p>
<ol>
<li>I/O 집약적 작업을 비동기 처리</li>
<li>파일 시스템 캐싱 최적화 (noatime 옵션)</li>
<li>RAID 구성 또는 SSD로 업그레이드</li>
<li><code>ionice</code>로 I/O 우선순위 조정
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># 백그라운드 작업에 ionice 적용</span>
</span></span></code></pre></div></li>
</ol>
</blockquote>
<p>tar -cf backup.tar /data/ | ionice -c 3 &gt; backup.tar.bz2</p>
<blockquote>
<pre tabindex="0"><code></code></pre></blockquote>
<h2 id="4-실제-사례-cpu-과부하-문제-해결">4. 실제 사례: CPU 과부하 문제 해결</h2>
<h3 id="41-문제-상황">4.1 문제 상황</h3>
<ul>
<li>CPU 사용률 95% 이상 지속</li>
<li><code>top</code>에서 <code>java</code> 프로세스 1개가 90% CPU 점유</li>
<li><code>iostat</code>에서 <code>await</code> 0.5ms (정상)</li>
<li><code>vmstat</code>에서 <code>cs</code> 1,200/초 (정상 범위)</li>
</ul>
<h3 id="42-해결-과정">4.2 해결 과정</h3>
<ol>
<li><code>top -H -p &lt;PID&gt;</code>로 Java 프로세스 내 스레드 확인</li>
<li><code>jstack &lt;PID&gt;</code>로 스레드 덤프 분석</li>
<li>특정 HTTP 요청 처리 시 무한 루프 발견</li>
<li>코드 수정 후 CPU 사용률 15%로 감소</li>
</ol>
<h2 id="5-공식-문서-및-추가-자료">5. 공식 문서 및 추가 자료</h2>
<ul>
<li><a href="https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/performance_tuning_guide/">Red Hat Enterprise Linux 8 Performance Tuning Guide</a></li>
<li><a href="https://linux.die.net/man/1/iostat">sysstat documentation (iostat, vmstat 등)</a></li>
</ul>
<h2 id="결론">결론</h2>
<p><code>top</code>, <code>iostat</code>, <code>vmstat</code>은 Linux 성능 문제의 80% 이상을 해결할 수 있는 핵심 도구입니다. 이 세 가지 도구를 조합해 사용하면 CPU, 메모리, 디스크, 네트워크 등 다양한 계층에서 발생하는 병목 현상을 정확히 진단할 수 있습니다. 문제 발생 시 반드시 <strong>지표 간 상관관계</strong>를 분석하는 습관을 기르세요. 예를 들어 CPU 사용률이 높은데 <code>iostat</code>의 <code>await</code>도 높다면, 디스크 I/O로 인한 CPU 대기 상태일 수 있습니다.</p>
<blockquote>
<p><strong>최종 점검 리스트</strong>:</p>
<ol>
<li><code>top</code>으로 CPU/메모리 사용 프로세스 확인</li>
<li><code>iostat</code>으로 디스크 병목 여부 판단</li>
<li><code>vmstat</code>으로 컨텍스트 스위칭/페이징 이상 패턴 감지</li>
<li>모든 지표를 종합적으로 분석</li>
</ol>
</blockquote>
]]></content:encoded>
    </item>
  </channel>
</rss>
