<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Mpm on Joonlog</title><link>https://joonlog.github.io/tags/mpm/</link><description>Recent content in Mpm on Joonlog</description><generator>Hugo -- gohugo.io</generator><language>ko-kr</language><lastBuildDate>Fri, 25 Apr 2025 09:00:00 +0900</lastBuildDate><atom:link href="https://joonlog.github.io/tags/mpm/index.xml" rel="self" type="application/rss+xml"/><item><title>Apache OPTIONS * 루프백 요청으로 인한 CPU 과부하 TroubleShooting</title><link>https://joonlog.github.io/p/apache-options-%EB%A3%A8%ED%94%84%EB%B0%B1-%EC%9A%94%EC%B2%AD%EC%9C%BC%EB%A1%9C-%EC%9D%B8%ED%95%9C-cpu-%EA%B3%BC%EB%B6%80%ED%95%98-troubleshooting/</link><pubDate>Fri, 25 Apr 2025 09:00:00 +0900</pubDate><guid>https://joonlog.github.io/p/apache-options-%EB%A3%A8%ED%94%84%EB%B0%B1-%EC%9A%94%EC%B2%AD%EC%9C%BC%EB%A1%9C-%EC%9D%B8%ED%95%9C-cpu-%EA%B3%BC%EB%B6%80%ED%95%98-troubleshooting/</guid><description>&lt;h3 id="문제-상황"&gt;문제 상황
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;운영 중인 CentOS 서버에서 너무 많은 수의 &lt;code&gt;httpd&lt;/code&gt; 프로세스가 CPU를 과점유하고, Load Average가 30 이상까지 치솟는 현상이 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="원인-분석"&gt;원인 분석
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;access_log&lt;/code&gt; 확인 결과, 루프백 주소(&lt;code&gt;::1&lt;/code&gt;)에서 &lt;code&gt;OPTIONS * HTTP/1.0&lt;/code&gt; 요청이 수 초 간격으로 다수 발생&lt;/li&gt;
&lt;li&gt;User-Agent는 &lt;code&gt;&amp;quot;Apache/... (internal dummy connection)&amp;quot;&lt;/code&gt;으로, Apache 자체가 생성하는 dummy connection임을 확인
&lt;ul&gt;
&lt;li&gt;이 요청은 Apache의 internal dummy connection이며, 일반적으로는 MPM이 유휴 프로세스를 관리하기 위해 보내는 내부 테스트용 요청&lt;/li&gt;
&lt;li&gt;하지만 일정 이상 발생하게 되면, 해당 요청을 처리하기 위한 httpd 프로세스가 과도하게 생성되고 정리되지 않아, 리소스를 점유&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# tail -n 1000 /var/log/httpd/access_log | grep &amp;#34;::1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;::1 - - &lt;span class="o"&gt;[&lt;/span&gt;22/Apr/2025:07:01:55 +0000&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;OPTIONS * HTTP/1.0&amp;#34;&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt; - &lt;span class="s2"&gt;&amp;#34;-&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips (internal dummy connection)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;::1 - - &lt;span class="o"&gt;[&lt;/span&gt;22/Apr/2025:07:02:34 +0000&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;OPTIONS * HTTP/1.0&amp;#34;&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt; - &lt;span class="s2"&gt;&amp;#34;-&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips (internal dummy connection)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;::1 - - &lt;span class="o"&gt;[&lt;/span&gt;22/Apr/2025:07:02:35 +0000&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;OPTIONS * HTTP/1.0&amp;#34;&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt; - &lt;span class="s2"&gt;&amp;#34;-&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips (internal dummy connection)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;::1 - - &lt;span class="o"&gt;[&lt;/span&gt;22/Apr/2025:07:02:36 +0000&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;OPTIONS * HTTP/1.0&amp;#34;&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt; - &lt;span class="s2"&gt;&amp;#34;-&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips (internal dummy connection)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;::1 - - &lt;span class="o"&gt;[&lt;/span&gt;22/Apr/2025:07:02:42 +0000&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;OPTIONS * HTTP/1.0&amp;#34;&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt; - &lt;span class="s2"&gt;&amp;#34;-&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips (internal dummy connection)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;::1 - - &lt;span class="o"&gt;[&lt;/span&gt;22/Apr/2025:07:02:56 +0000&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;OPTIONS * HTTP/1.0&amp;#34;&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt; - &lt;span class="s2"&gt;&amp;#34;-&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips (internal dummy connection)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# httpd -V | grep MPM&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;Fri Apr &lt;span class="m"&gt;25&lt;/span&gt; 04:35:44.665826 2025&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;so:warn&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;pid 31382&lt;span class="o"&gt;]&lt;/span&gt; AH01574: module rewrite_module is already loaded, skipping
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Server MPM: prefork
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;MPM 관련 설정(StartServers, MaxRequestWorkers)이 명시되지 않은 상태
&lt;ul&gt;
&lt;li&gt;Apache 기본값(최대 256개 프로세스)이 적용된 것으로 추정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="조치-내용"&gt;조치 내용
&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;하기 내용은 Apache 설정을 수정하지 않고 즉시 대응 가능한 임시 조치&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;IPv6 루프백 dummy connection 차단을 위한 ip6tables 규칙 추가&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;루프백(&lt;code&gt;::1&lt;/code&gt;)에서 들어오는 &lt;code&gt;OPTIONS *&lt;/code&gt; 요청만 차단&lt;/li&gt;
&lt;li&gt;외부 요청이나 정상적인 HTTP 트래픽에는 영향 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ip6tables -I INPUT -s ::1 -p tcp --dport &lt;span class="m"&gt;80&lt;/span&gt; -m string --algo bm --string &lt;span class="s2"&gt;&amp;#34;OPTIONS *&amp;#34;&lt;/span&gt; -j DROP
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start="2"&gt;
&lt;li&gt;Apache 재기동&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;이미 생성되어 남아 있는 과도한 &lt;code&gt;httpd&lt;/code&gt; 프로세스를 정리하고 초기화&lt;/li&gt;
&lt;li&gt;신규 요청부터는 차단 규칙이 적용된 상태로 운영&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl restart httpd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start="3"&gt;
&lt;li&gt;CPU 사용률 및 Load Average 수 분 내로 정상화&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="결론"&gt;결론
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;httpd&lt;/code&gt; 프로세스 수 안정화, 더 이상 루프백 &lt;code&gt;OPTIONS *&lt;/code&gt; 요청 발생하지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="추가-조치-방안"&gt;추가 조치 방안
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;문제의 근본 원인을 해결하기 위해서는 Apache 설정 최적화 필요&lt;/li&gt;
&lt;li&gt;특히, 현재 서버는 prefork MPM을 사용하고 있으며, 기본 설정값으로 운영중&lt;/li&gt;
&lt;li&gt;이로 인해 부하 상황에서 과도한 프로세스 생성 및 dummy connection 폭주 현상이 발생한 것으로 분석됨&lt;/li&gt;
&lt;li&gt;mpm 설정 추가
&lt;ul&gt;
&lt;li&gt;MaxRequestWorkers를 서버 사양에 맞게 제한&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# /etc/httpd/conf.modules.d/00-mpm.conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;IfModule mpm_prefork_module&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; StartServers &lt;span class="m"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MinSpareServers &lt;span class="m"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MaxSpareServers &lt;span class="m"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MaxRequestWorkers &lt;span class="m"&gt;150&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ServerLimit &lt;span class="m"&gt;150&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;/IfModule&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item></channel></rss>