웹 서버를 정기적으로 다시 시작하는 것이 업계 최고의 모범 사례입니까? [닫은]


28

Tomcat에서 실행되는 웹 응용 프로그램 (타사에서 개발)이 있습니다. 응용 프로그램에서 성능이 매우 떨어졌습니다. 응용 프로그램 개발자는 매일 밤마다 웹 서버를 다시 시작하여 모든 메모리 사용을 늘리고 다시 시작하는 것이 업계 모범 사례라고 주장합니다.

고객의 관점에서 하루 동안 사이트 충돌 문제를 완화하지만 SysAdmin 관점에서 보면 끔찍한 솔루션입니다.

우리는 서로 다른 클라이언트를 위해 서로 다른 서버에 이러한 응용 프로그램 20 개를 호스팅하며 매일 밤 모두 다시 시작되도록 조정합니다.


41
응용 프로그램 개발자가 메모리 누수를 찾아 수정하는 것이 업계 모범 사례라고 알려주십시오.
Bart Silverstrim

4
@Bart 오 스냅 !!
mfinni

1
나의 하루를 만들기위한 +1 (PS : 나는 개발자이다)
RN.

1
그는 서버 또는 서비스를 말했습니까? 매일 밤 서비스를 다시 시작해야하는 바람둥이 응용 프로그램이 있습니다. 내가하지 않으면 나중에 어느 시점에서 충돌이 발생합니다. 차라리하지 않지만 낮 동안의 서비스가 더 중요합니다.
욕조

1
로그 파일 모니터링을 시작하고 일부 JVM 모니터링 도구를 다운로드하십시오. 낮에 문제가 발생하면 기본 예외 일지라도 예외 또는 기록되는 것이 표시되어야합니다. 그러면 오류의 일반적인 특성에 대한 통찰력을 얻을 수 있습니다. 또한 JVM 메모리 사용량을 확인하십시오. 홀수는 실제로 메모리 누수가 있으며 서버 JVM 힙을 보면 잡을 수 있습니다. 좋은 sysadmin 데이터로 나쁜 개발에 맞서십시오. 그것은 "당신은 무엇을하고 있는지 모른다"방어를 파괴하고 실제로 왜 일이 엉망이되었는지에 대한 답변을하게한다.
FloppyDisk

답변:


29

이것은 최선의 방법이 아닙니다. 모든 것이 올바르게 작동하는지 확인하기 위해 주기적으로 서버를 다시 시작 하는 것이 좋지만 야간에 다시 시작해야하는 경우 응용 프로그램에서 매우 심각한 메모리 누수가 발생합니다.


1
이것은 매우 좋은 지적입니다. 아래 제안 된대로 서버를 다시 시작하지 않으면 제대로 시작되지 않는 특정 서비스가 있다는 것을 모를 수 있습니다. 그런 다음 정전 / 하드 재시작시 서버가 제대로 돌아 오지 않을 수 있습니다.
einstiien

1
+1. 매월 다시 시작하는 것뿐만 아니라 패치를 적용하는 일반적인 작업 절차에 대해 더 의미가있을 수 있습니다. 한 번은 약 1500 대의 서버, 24/7에 대한 관리 팀의 일원이었고 매월 3 박 "롤링이있었습니다. 모든 패치 등도 서버에 저장됩니다. 이는 일부 계획 안정성과 표준 운영 절차에 영향을줍니다.
TomTom

12

"Best Practice", 많은 사람들이 정당한 이유로하는 일과 "Common Practice", 많은 사람들이 게 으르거나 무지하기 때문에하는 것 사이에는 차이가 있습니다.

계속 정상적으로 실행하기 위해 정기적으로 다시 시작하거나 재부팅해야하는 응용 프로그램 및 (나쁜) 서버 일반적입니다. 그러나 또한 심각한 버그가 있음을 분명히 나타냅니다.

정기적으로 응용 프로그램을 다시 시작하도록 SOP를 설정하면 회사는 카펫 아래에 심각한 버그를 숨기고 있습니다. 이것은 변명 할 수 없으며, 벌레는 엎질러지고 찌그러 지거나 나중에 다시 물릴 것입니다.

이상적인 회사는 더 나은 개발자를 찾아야합니다. 불행히도 이로 인해 많은 코드를 다시 작성하는 데 많은 작업이 발생할 수 있습니다. 개발자가 잘못 작성된 코드를 수용 할 수 있다고 생각하거나 버그가있는 코드의 증상을 인식 할만큼 충분히 알지 못한다는 사실은 코드의 품질이 낮음을 나타냅니다. 좋은 개발자는 헌법 상 그 상태로 둘 수 없습니다.

개발자를 대신 할 수있는 위치에 있지 않을 경우 몇 가지 제안 사항이 있습니다.

  • 더 나은 개발자가 코드를 검토하고 코드에 대해 무언가를 할 수있는 사람에게 평가를보고 할 수 있는지 확인하십시오.
  • 프로파일 링 도구를 살펴보십시오. 기술 및 / 또는 성향이 있다면 코드를 직접 프로파일 링하여 누출을 찾아보고하십시오.

개발자 중심의 프로파일 링 도구를 사용하지 않아도 Java 응용 프로그램의 메모리 사용을 프로파일 링하고 모니터링하는 데 필요한 sysadmin 중심의 도구가 많이 있습니다. 어떤 경우 든 프로덕션 서버에서 메모리 모니터링 (특히 힙)을 실제로 설정해야합니다. 품질 코드를 실행하는 경우에도 권장합니다. 버그가 많은 앱이 넘어 질 때 미리 경고 할 수 있습니다.

그러나 더 나은 방법은 누출이 있다는 증거를 수집하는 데 도움이되며 응용 프로그램의 문제 위치를 나타낼 수도 있습니다. 이를 통해 로비에 탄약을 더 잘 고정시킬 수 있습니다.


2
실제로, 개발자 코드가 아닌 버그가있는 인프라가 많은 경우가 많습니다. 우리는 JBoss에서 주기적으로 가비지 수집 지옥에 들어가지만 다른 상거래 응용 프로그램 서버에서는 잘 작동하는 J2EE 응용 프로그램에 문제가 없었습니다. 따라서 개발자의 잘못이 아니라 배포 환경 일 수 있습니다.
rmalayter

6

응용 프로그램 개발자는 자신이 수행 한 전문가가 아닌 작업을 수행하여 자신의 엉덩이를 가리는 것이 자신에게 가장 큰 이익이라고 주장합니다. 그는 실제로 엄청난 메모리 누수로 무언가를 썼다는 것을 인정하지는 못했지만 그다지 부족하지는 않습니다.


3

여기에 많은 답변이 실용적인 솔루션의 표식에서 벗어난 것처럼 보입니다. 그들은 도그마를 피하는 것 같습니다-서버를 다시 시작해서는 안됩니다-왜 5 9가 있습니까? 결함 허용? 그래서 그들은 그들이 일어나기로되어있을 때 그들은 유지됩니다.

또한 나쁜 개발자 또는 나쁜 개발 관행의 원인을 밝히는 것이 문제의 근본 원인이 아닙니다. 응용 프로그램 코드가 나쁘지 않을 수도 있습니다. 이러한 문제는 이미 많은 시스템 코드에 내장되어 있습니다. 우리가하는 것처럼 작은 응용 프로그램을 많이 실행하면 작은 메모리 누수, Java 힙 및 permgen 문제가 발생합니다. 최신 서버와 이들이 실행하는 소프트웨어는 매우 복잡합니다. Tomcat과 같은 서버가 파일을 제공하고, 웹 요청을 처리하고, 네트워크 통신, 데이터베이스 통신 등 무엇을해야하는지 생각하면 많은 일을합니다. 그 스택에는 많은 움직이는 부분이 있습니다.

적극적으로 서버를 재부팅하면 일주일에 한 달에 한 번 스마트하고 효율적이라고 말할 수 있습니다. 클러스터되고 서버를 회전시키는 경우 클라이언트에 1 비트를 영향을 미치지 않아야합니다. 클라이언트는 서버 성능에 훨씬 만족할 것입니다.


2

IMO 서버는 가능한 한 적게 종료해야합니다. 앱 개발자가 메모리 누수로 복잡한 응용 프로그램을 구축했을 가능성이 높습니다.


당연히 OP는 더 나은 개발자를 찾아야한다고 누군가에게 말해야한다고 생각합니다.
Helvick

2
대기업이 9 배의 가동 시간으로 막대한 비용을 지불하는 이유와 회사가 중복 전원 공급 장치, RAID, 핫 스왑 케이지 등에 수천을 소비하는 이유가 있으며 확실히 하루에 한 번만 재부팅하면되지는 않습니다.
Bart Silverstrim

1

매일 밤마다 웹 서버 중 하나를 다시 시작하는 스크립트가 있지만 업계 표준이 아닌 Java 응용 프로그램이 잘못 작성되어 있기 때문입니다. 웹 서비스를 다시 시작하는 것은 드문 일이 아닙니다. 이렇게하면 찾고있는 메모리 정리가 수행되고 전체 다시 시작과 비교하여 서버의 부담이 줄어 듭니다.


1

서버는 다시 시작 하지 않는 것이 좋습니다 . 이것이 내결함성 이있는 이유 중 하나입니다 . 응용 프로그램으로 인해 서버를 다시 시작해야하는 경우 응용 프로그램에서 메모리가 누출되어 잘못 구성되었습니다.

나는 이전에 Tomcat과 함께 일해 왔으며 다음과 같은 문제가있었습니다. 다음에 Java 컨테이너로 작업 할 때 다른 컨테이너, 아마도 JBoss 또는 GlassFish를 찾을 것입니다.

편집 : 매일 밤마다 다시 시작 해야하는 경우 부하가 증가 할 때 더 자주 다시 시작해야합니다. 견고한 응용 프로그램을 사용해야합니다. 이것이 최고의 솔루션입니다.


4
서버를 다시 시작해서는 안된다고 말할 때 동의하지 않습니다. 보안 수정 사항을 적용하려면 서버를 다시 시작해야합니다. 계획된 유지 보수 이외의 다른 작업을 위해 다시 시작할 필요는 없습니다.
Zoredache

보안 수정을 적용하려면 일부 서버를 다시 시작해야합니다. 그러나 시스템이 충분하면 시스템을 다시 시작할 필요가 없습니다. 해마다 실행되는 시스템이 있습니다. 인터넷에서 서비스를 제공하는 경우 고 가용성을 목표로해야합니다. 클러스터와 같은 내결함성 시스템이있는 경우 서비스가 여전히 실행 중일 때 노드를 하나씩 중단하고 업데이트 할 수 있습니다.
조나스

1
단일 서버 및 / 또는 하드웨어 만있는 경우 고가용 성과 같은 것은 없습니다. 서버를 하나만 주었고 서비스가 너무 중요하여 서버를 다시 시작하기 위해 매번 15 분의 다운 타임을 허용 할 수없는 경우에는 잘못하고 있습니다. 당신이 "다운 타임이없는"응용 프로그램이있는 경우에, 당신은 여러 노드와 진정한 HA 시스템을 가지고있다. 이 경우 패치 등을 위해 정기적으로 재부팅하는 것은 지적한 것처럼 매우 쉽습니다.
EEAA

1
"다음에는 ... Tomcat 이외의 다른 Java 컨테이너를 찾을 것입니다." 나는 Tomcat을 비난하지 않을 것입니다. 몇 년 동안 프로덕션 서비스를 실행 해 왔으며이 문제가 발생할 때마다 응용 프로그램 문제로 판명되었습니다. "최고의 솔루션 인 견고한 응용 프로그램을 확보하십시오." 놀랍게도, 지금까지 사용한 다른 모든 Java 응용 프로그램 서버는 누수 된 코드를 실행할 때 비슷한 문제가 발생합니다. 즉, Tomcat 7에는 일종의 사전 메모리 누수 감지 기능이 있어야합니다.
Kief

0

내가 본 가장 빈번한 것은 매주입니다. 내가 지금있는 곳에 우리는 Windows 상점이고, 우리는 화요일 패치 다음 주말에 그것을 매달한다.


한 곳에서 작업을 시작했을 때 밤새 재부팅이 발생했다는 사실을 발견했습니다. 특히 서버가 1-2 %의 확률로 제대로 돌아 오지 않을 가능성이 있기 때문에 특히 끔찍했습니다 (하드 드라이브 드라이버의 타이밍 버그) ). 재부팅에 대한 "원인"을 수정하는 데 시간이 걸렸습니다. 잘 시간.
Brian Knoblauch

0

서버를 지속적으로 다시 시작하는 것이 이상적이지 않다는 데 동의하지만 개발자의 잘못이나 잘못이 아닌 상황이 있습니다. Python Popen 라이브러리의 문제로 인해 메모리가 누출되는 잘 작동하는 응용 프로그램이 있습니다. 곧 폐기 될 오래된 애플리케이션이지만 업무상 중요합니다. 우리는 고객을 위해 최소한의 혼란으로 계속 운영해야합니다. 그래서 우리는 매일 밤 서버를 다시 시작하기로 결정했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.