백그라운드 작업을 너무 많이 시작하면 어떻게 되나요?

백그라운드 작업을 너무 많이 시작하면 어떻게 되나요?

700개의 네트워크 장치에서 일부 작업을 완료하려면 Expect 스크립트를 사용해야 합니다. 순차적으로 끝낼 수는 있는데 현재까지의 러닝타임이 24시간 정도 되네요. 이는 주로 연결을 설정하는 데 걸리는 시간과 이러한 장치(이전 장치)의 출력 대기 시간 때문입니다. 두 개의 연결을 설정하고 병렬로 실행할 수 있지만 이를 얼마나 멀리까지 확장할 수 있습니까?

700개의 작업을 동시에 완료할 수는 없을 것 같지만, 물론 '아니요'에도 한계가 있습니다. 내 가상 머신이 관리할 수 있는 텔넷 연결 수입니다.

다음과 같은 일종의 루프에서 700개를 시작하려고 하면 다음과 같습니다.

for node in `ls ~/sagLogs/`; do  
    foo &  
done

그리고

  • CPU 12 CPU x Intel(R) Xeon(R) CPU E5649 @ 2.53GHz

  • 메모리 47.94GB

내 질문은 다음과 같습니다

  1. 700개의 인스턴스를 모두 동시에 실행할 수 있습니까?
  2. 서버가 한도에 도달하기 전에 어디까지 갈 수 있나요?
  3. 해당 제한에 도달하면 다음 반복이 시작될 때까지 기다리나요 foo, 아니면 충돌이 발생하나요?

안타깝게도 저는 엔터프라이즈 프로덕션 환경에서 실행 중이므로 정확하게 시험해보고 무슨 일이 일어나는지 확인할 수 없습니다.

답변1

700개의 인스턴스를 모두 동시에 실행할 수 있습니까?

동시의 의미에 따라 다릅니다. 우리가 까다롭다면, 시스템에 악용 가능한 실행 스레드가 700개가 있지 않는 한(아마도 그렇지 않을 것입니다) 그들은 그렇게 할 수 없습니다. 그러나 현실적으로는 시스템에 충분한 RAM 및/또는 스왑 공간이 있는 한 아마도 그렇게 될 것입니다. UNIX와 그 다양한 하위 시스템은 대량의 동시성을 관리하는 데 매우 뛰어나며, 이는 UNIX가 대규모 HPC 사용에 널리 사용되는 이유 중 하나입니다.

서버가 한도에 도달하기 전에 어디까지 갈 수 있나요?

추가 정보 없이는 구체적으로 답변하는 것이 불가능합니다. 다음 사항을 만족하려면 충분한 메모리가 필요합니다.

  • 작업의 전체 런타임 메모리 요구 사항은 700배입니다.
  • bash는 매우 많은 작업에 필요한 메모리를 관리합니다(bash는 이 작업이 나쁘지는 않지만 작업 제어가 완전히 효율적이지는 않습니다).
  • 시스템의 기타 메모리 요구 사항.

이 요구 사항을 충족한다고 가정하면(다시 말하지만 RAM이 50GB만 있어도 여전히 다른 문제를 처리해야 합니다.)

  • bash는 작업 제어에 얼마나 많은 CPU 시간을 낭비합니까? 그다지 많지 않을 수도 있지만 수백 개의 작업에 대해서는 상당한 것일 수 있습니다.
  • 여기에는 어느 정도의 네트워크 대역폭이 필요합니까? 이러한 연결을 모두 여는 것만으로도 대역폭과 대기 시간에 따라 몇 분 동안 네트워크가 폭주할 수 있습니다.
  • 제가 생각지도 못한 일이 많을 수도 있습니다.

해당 제한에 도달하면 foo의 다음 반복이 시작될 때까지 기다릴까요, 아니면 충돌이 발생할까요?

어느 한도에 도달했는지에 따라 다릅니다. 메모리인 경우 시스템의 무언가가 죽거나(구체적으로는 메모리를 확보하려고 시도하는 동안 커널에 의해 종료됨) 시스템 자체가 충돌할 수 있습니다(메모리가 부족할 때 의도적으로 충돌하도록 시스템을 구성하는 경우는 드뭅니다). . CPU 시간이라면 문제 없이 계속 실행되지만 시스템에서 다른 작업을 수행하는 것은 불가능합니다. 네트워크 문제인 경우 충돌이 발생할 수 있습니다.다른시스템이나 서비스.


너 뭐야진짜여기서 필요한 것은 모든 작업을 동시에 실행하는 것이 아닙니다. 대신, 일괄 처리로 분할하고 일괄 처리 내의 모든 작업을 동시에 실행하고 완료한 후 다음 일괄 처리를 시작하세요. GNU 병렬(https://www.gnu.org/software/parallel/)를 이 목적으로 사용할 수 있지만 프로덕션 환경에서는 이 규모에서는 이상적이지 않습니다(사용하는 경우 네트워크가 넘쳐 다른 방법으로는 건드릴 수 없는 시스템에 영향을 미칠 수 있다고 말했듯이 너무 공격적이지 마십시오) ). Ansible과 같은 적절한 네트워크 조정 도구를 살펴보는 것이 좋습니다(https://www.ansible.com/) 이는 동시성 문제를 해결할 뿐만 아니라(Ansible은 위에서 언급한 일괄 처리를 자동화함) 다른 많은 유용한 기능(예: 작업의 멱등성 실행, 양호한 상태 보고 및 기타 여러 도구와의 통합)도 제공합니다. ).

답변2

설명하신 방식으로 백그라운드 작업으로 실행할 수 있는 인스턴스 수를 지정하기는 어렵습니다. 하지만 일반 서버는 제대로 운영되기만 하면 700개의 동시 연결을 확실히 유지할 수 있습니다. 웹 서버는 항상 이 작업을 수행합니다.

GNU Parallel(https://www.gnu.org/software/parallel/) 또는 이를 달성하기 위해 유사한 것이 있습니까? 백그라운드 작업 방법의 많은 이점을 제공합니다.

  • 동시 세션 수를 쉽게 변경할 수 있습니다.
  • 새 세션을 시작하기 전에 세션이 완료될 때까지 기다립니다.
  • 이렇게 하면 유산하기가 더 쉬워집니다.

빠르게 시작하려면 여기를 살펴보세요.https://www.gnu.org/software/parallel/parallel_tutorial.html#A-single-input-source

답변3

&일부 작업을 수행하고 진행 상황을 모니터링할 때 병렬 처리를 사용하는 것이 좋습니다. 그러나 엔터프라이즈 프로덕션 환경에서 실행하는 경우 더 많은 제어 기능을 제공하는 것이 필요합니다.

ls ~/sagLogs/ | parallel --delay 0.5 --memfree 1G -j0 --joblog my.log --retries 10 foo {}

이는 foo의 모든 파일에 대해 실행됩니다 ~/sagLogs. 0.5초마다 작업을 시작하고 1GB의 RAM이 사용 가능한 한 많은 작업을 병렬로 실행하지만 시스템 제한(예: 파일 및 프로세스 수)을 준수합니다. 일반적으로 이는 허용되는 열린 파일 수를 조정하지 않으면 250개의 작업을 병렬로 실행한다는 의미입니다. 열린 파일 수를 조정하는 경우 메모리가 충분하다면 32,000개를 병렬로 실행하는 것도 문제가 되지 않습니다.

작업이 실패하면(예: 오류 코드 반환) 10번 다시 시도합니다.

my.log작업이 성공했는지 여부를 알려줍니다(아마도 재시도 후).

답변4

백그라운드 작업을 너무 많이 시작하면 어떻게 되나요?

최악의 경우 시스템이 느려지고 응답하지 않게 됩니다. 전원 버튼을 누르고 하드 재부팅을 수행하는 것이 더 좋습니다. 이렇게 하면 루트에서 벗어날 수 있는 권한이 있는 무언가가 루트로 실행됩니다. bash 스크립트가 일반 사용자 권한으로 실행되는 경우 가장 먼저 떠오르는 것은 /etc/security/limits.conf[ /etc/systemd/system.conf이상적으로] 그 안의 모든 변수 입니다.예방하다 사용자는 다음에서 왔습니다.초과 적재체계.

  • CPU = 제온 E5649, 즉 12-핵무기CPU; 따라서 12개의 프로세스를 동시에 실행하는 12개의 코어가 있고 각 프로세스는 100% 속도로 12개의 코어 중 하나를 활용합니다. 24개의 프로세스를 시작하면 각 프로세스는 12개의 코어에서 50%의 활용률(700개의 프로세스 = 1.7%)로 실행됩니다. 그러나 이는 컴퓨터이며 모든 것이 적절하고 적절한 시간에 올바르게 수행되는 한 성공은 불가능합니다. 항상 중요한 것은 아닙니다.

    1. 700개의 인스턴스를 모두 동시에 실행할 수 있습니까? 물론 700은 큰 숫자가 아닙니다. maxproc예를 들어 /etc/security/limits.conf의 기본값은 4,135,275입니다.

    2. 서버가 한도에 도달하기 전에 어디까지 갈 수 있나요? 700보다 훨씬 더 많은 것 같아요.

    3. 한계...스크립트가 아래에서 시작되면 어떻게 되나요?사용자[보통 거의 모든 사람에게 루트가 작동하는] 계정은 700회 시도 후에 limits.conf스크립트가 종료된다는 것입니다 .foo &부자각 프로세스에는 서로 다른 PID가 있지만 456(임의의 숫자 선택)만 표시되고 나머지 244는 일부 보안 또는 시스템 제한으로 인해 차단되어 시작되지 않습니다.

백만 달러짜리 질문: 동시에 몇 개를 실행해야 합니까?

참가하다회로망각각이 텔넷 연결을 할 것이라고 말했지만, 교육받은 추측에 따르면 CPU 및 RAM 제한을 수행하기 전에 네트워크 제한 및 오버헤드에 부딪힐 것입니다. 하지만 정확히 무엇을 하고 있는지는 모르겠습니다. 한 번에 700개를 모두 시작할 수 있지만 이전 프로세스와 네트워크 연결이 완료될 때까지 자동으로 차단되고 다양한 시스템 제한에 따라 종료됩니다. 그런 식으로 500개는 시작되고 나머지 200개는 시스템이나 커널 제한으로 인해 시작되지 않습니다. 그러나 동시에 실행되는 수가 아무리 많아도 항상 일부는 있을 것입니다.달콤한가능한 한 빨리 작업을 완료하고 오버헤드를 최소화하고 효율성을 높이세요. 코어가 12개(CPU가 2개인 경우 코어 24개)인 경우 즉시 12개(또는 24개)로 시작하고 런타임 개선이 없을 때까지 동시 배치 수를 12개 또는 24개씩 늘립니다.

힌트:Google최대 텔넷 연결 수그리고 이것이 귀하의 시스템에 어떻게 적용되는지 알아보십시오. 또한 방화벽도 잊지 마세요. 또한 프로세스당 필요한 메모리 x 700을 빠르게 계산하십시오. 여유 RAM(귀하의 경우 약 50GB)이 있는지 확인하십시오. 그렇지 않으면 시스템이 SWAP을 사용하기 시작하여 본질적으로 응답하지 않게 됩니다. 그래서 12번과 24번 킥은질소RAM 여유 공간을 한 번 처리하고 모니터링한 후 늘리세요.질소이미 무슨 일이 일어나고 있는지 어느 정도 알고 있습니다.

기본적으로 RHEL은 단일 호스트에 대한 텔넷 연결 수를 동시 세션 10개로 제한합니다. 이것은 보안 기능입니다... 10으로 설정하고, /etc/xinetd.conf, "per_source" 값을 변경하십시오.

관련 정보