간단한 예입니다. 저는 TCP 소켓을 사용하여 http 요청을 처리하는 프로세스를 실행하고 있습니다. A) CPU가 병목 현상을 일으키는 무언가를 계산하는 경우 B) 네트워크에 병목 현상을 일으킬 수 있는 대용량 파일을 전송하는 경우 또는 C) 디스크 병목 현상을 일으키는 반무작위 액세스를 사용하는 복잡한 데이터베이스 쿼리일 수 있습니다.
각 페이지/API 호출을 위 유형 중 하나 이상으로 분류하고 각 페이지/API 호출 수의 균형을 맞춰야 합니까? 아니면 OS가 대신 해줄까요? 필요한 스레드 수를 어떻게 결정합니까?
하드웨어 스레드 12와 48에 2개의 숫자를 사용하겠습니다(Intel Xeon에는 그 만큼의 숫자가 있습니다). CPU 사용량이 많은 경우(8/32) 스레드 2/3, 디스크 사용량이 많은 경우 스레드 1개(또는 디스크당 사용량이 많은 스레드 1개), 나머지 3/15는 다른 용도로 사용할 생각입니다. 네트워크 균형을 맞추세요.
12/48 스레드만 지원하는 하드웨어에 12/48개 이상의 스레드가 있어야 합니까? CPU가 더 느린 조절 모드로 들어가지 않도록 더 적은 양을 원하는가?(무엇을 부르는지는 잊어버렸지만 동시에 너무 많은 칩이 활성화되면 이런 일이 발생할 수 있다고 들었습니다). 스레드를 로드하고 리소스 균형을 조정해야 하는 경우 어떻게 해야 합니까?
답변1
리눅스:
Linux 커널은 이를 잘 구현하고 실행 중인 프로세스의 리소스를 관리하도록 설계된 많은 기능/설정을 가지고 있습니다(CPU 관리자, sysctl 또는 cgroups를 통해). 이 경우 이러한 설정을 조정하고 스왑 조정(필요한 경우)을 조정합니다. 권장됩니다. 기본적으로 장치에 따라 기본 작업 모드를 조정합니다.
특히 프로덕션 서버에서는 변경 사항을 적용한 후 벤치마킹, 스트레스 테스트 및 상황 분석이 필수입니다. 커널 설정을 원하는 용도로 조정하면 성능이 크게 향상될 수 있습니다. 반면에 이를 위해서는 다양한 설정을 테스트하고 완전히 이해해야 하므로 관리자에게는 매우 많은 시간이 소요될 수 있습니다.
리눅스는 다음을 사용합니다지사실행 중인 애플리케이션 간에 CPU 리소스에 대한 로드 균형을 맞추기 위해 여러 조정기를 사용할 수 있습니다. 배포 커널에 따라 일부 조정기를 사용하지 못할 수도 있습니다(누락되었거나 비업스트림 조정기를 추가하기 위해 커널을 다시 빌드할 수 있음). 당신은 확인할 수 있습니다현 주지사는 누구인가,변화이 경우 더 중요한 것은,설정을 조정하세요.
추가 서류:읽다,가이드,유제,주파수 스케일링,주지사의 선택,성능 컨트롤러그리고CPU 주파수.
시스템 제어:
시스템 명령런타임에 커널 매개변수를 확인하고 변경하는 도구로, 구성 파일을 통해 영구적으로 조정할 수 있습니다 /etc/sysctl.conf
. Sysctl을 사용하여 많은 커널 설정을 변경할 수 있기 때문에 이는 이 답변의 중요한 부분입니다. 명령 sysctl -a
, 자세한 정보는 다음에서 확인할 수 있습니다.이것그리고이 기사.
범주:
커널은 다음 기능을 제공합니다. 이 가이드에서는 더 짧은 이름인 cgroup으로 불리는 제어 그룹. Cgroup을 사용하면 시스템에서 실행 중인 사용자 정의 작업(프로세스) 그룹에 CPU 시간, 시스템 메모리, 네트워크 대역폭 또는 이러한 리소스의 조합과 같은 리소스를 할당할 수 있습니다. 구성된 cgroup을 모니터링하고, 특정 리소스에 대한 cgroup 액세스를 거부하고, 실행 중인 시스템에서 cgroup을 동적으로 재구성할 수도 있습니다. cgconfig(제어 그룹 구성) 서비스는 부팅 시 사전 정의된 cgroup을 시작하고 재설정하여 재부팅 후에도 유지되도록 구성할 수 있습니다.
메모리:
이는 시스템의 RAM 용량이 제한된 경우에 유용합니다. 그렇지 않은 경우 RAM을 주로 사용하도록 스왑을 비활성화할 수 있습니다. 교환 시스템을 조정할 수 있습니다프로세스당또는교환 설정. 필요한 경우 프로세스별로 리소스(메모리)를 제한할 수 있습니다.한계값(다른 리소스를 제한하는 데에도 사용됩니다).
디스크:
디스크 I/O 설정(입력/출력 스케줄러)도 변경될 수 있습니다.무리크기.
대안:
다음과 같은 기타 도구좋아요,CPU 한도,중앙 처리 유닛,작업 세트또는한계값이 문제에 대한 대안으로 사용될 수 있습니다.
답변2
이에 대한 가장 좋은 대답은 "빨아보고 살펴보는 것"입니다. 스트레스 테스트를 수행하고 무엇이 최상의 결과를 제공하는지 확인하는 것입니다. 이는 스레드 동작의 매우 작은 차이로 인해 성능 차이가 발생할 수 있기 때문입니다.
다음은 주로 내 경험을 바탕으로 한 것입니다 ...
어디서 시작하나요?
Linux는 스레드 고갈을 방지하는 데 매우 능숙합니다. 이는 반드시 모든 스레드가 균등한 공유를 받는다는 의미는 아니지만 모든 스레드가 최소한 일부 공유를 받게 됩니다. CPU 시간을 놓고 경쟁하는 두 개의 스레드가 있는 경우... 한 스레드는 100% CPU를 사용하려고 하고 다른 스레드는 10%만 사용하려고 한다고 가정해 보겠습니다. 그러면 균형이 91%와 9로 균형을 이룬다면 나쁘지 않습니다. % 또는 어딘가에 Surprise가 그것을 둘러싸고 있습니다.
특정 리소스가 있는 경우 전반적인 성능이 저하될 수 있습니다.무겁게초과 구독되었습니다. 회전하는 하드 드라이브의 디스크 IO의 경우 특히 그렇습니다. 헤드는 디스크의 위치 간에 물리적으로 이동(탐색)해야 합니다.계속해서서로 다른 파일 간에 진동하면 상당한 속도 저하가 발생할 수 있습니다. 그러나 한 스레드가 IO 바인딩이 심하고 다른 스레드가 이 작업을 수행하려는 경우 일반적으로 영향은 매우 작습니다.조금IO.
이 두 가지가 결합되면 20% 초과 구독이 20% 과소 구독보다 일반적으로 더 낫다는 것을 의미합니다. 즉, CPU를 너무 많이 사용하지 않는 스레드에 대해 CPU 시간을 예약하지 마십시오.
예: CPU 바인딩 스레드와 디스크 IO 바인딩 스레드가 있고 코어 8개와 하드 드라이브 1개가 있는 경우에서 시작하다CPU 집약적인 스레드 8개와 하드 디스크 IO 집약적인 스레드 1개. 7과 1은 대부분의 시간 동안 코어를 유휴 상태로 둘 수 있습니다. 8과 1은 HD 스레드를 거의 소진하지 않을 것이므로 풀 HD 및 CPU 활용도를 얻을 수 있습니다.
수명이 짧은 스레드의 위험성
Linux가많은수명이 짧은 스레드. 이게 더 뻔해의도적으로 시스템을 손상시키려는 시도. 그러나 스레드/프로세스가 지속적으로 생성되면 Linux 성능이 저하될 수 있습니다.
귀하의 질문에는 수명이 긴 스레드처럼 들리는 전용 작업자 스레드가 설명되어 있습니다. 이것은 올바른 접근 방식처럼 들립니다.
런던 버스 효과
버스를 30분 정도 기다리면 곧바로 5대의 버스가 옵니다. 앞좌석 버스에 탄 승객들이 버스의 속도를 늦추기 때문에 이런 일이 발생한다. 후속 버스의 승객 부족으로 버스 속도가 빨라져 혼잡 효과가 발생했습니다.
특히 스레드가 리소스를 놓고 경쟁하는 경우 동일한 문제가 스레드에도 존재할 수 있습니다. 스레드가 한 디스크에서 읽은 다음 다른 디스크에 쓰는 등 예상대로 작업을 번갈아 수행하는 경우 예상대로 무작위로 분산되는 대신 함께 클러스터되는 경향이 있을 수 있습니다. 따라서 한 리소스로 인해 다른 리소스의 사용 속도가 느려질 수 있습니다. 따라서 때로는 스레드의 작업을 더 세분화하는 것이 더 나을 때도 있습니다.
cgroup
너무 자세히 설명하는 것은 피하겠습니다. 하지만 Linux에는 프로세스를 그룹화하고 집단 리소스를 제한할 수 있는 "cgroups"라는 기능이 있다는 점을 언급하고 싶습니다. 이는 추가 성능 조정에 유용합니다.
그들에 대한 간단한 토론이 있습니다여기. 하지만 장기적으로 도움이 될 수 있으므로 Google에서 시간을 보내서 그들이 무엇을 할 수 있는지 알아보는 것이 좋습니다.
답변3
당신은 이것에 대해 잘못된 방향으로 가고 있을 수도 있습니다. 간단한 동기식 IO를 수행하고 있습니까?
두 가지 방법은 다음과 같습니다.
Apache 방식: 동기식 IO, 연결당 하나의 프로세스, 작업 생성 및 삭제를 방지하기 위한 프로세스 풀. 이는 코딩하기 쉽고 초당 연결 수가 많지만 동시 연결 수가 적은 강력한 기능을 허용합니다.
Nginx 모드: 비동기 IO, 코어당 하나의 프로세스. 이는 pole
시스템 호출을 사용하여 연결, 패킷 및 디스크 IO를 기다립니다. 일부 기능을 코딩하기 어렵게 만드는 경우(필요한 경우 상태를 명시적으로 저장해야 함) 더 많은 동시 연결을 가질 수 있습니다.
두 가지 방법 모두 운영 체제에서 스레드의 균형을 맞추고 코어, 디스크 및 네트워크를 완전히 활용할 수 있습니다. 코어당 하나의 스레드와 동기식 IO를 선택하면 대부분의 코어가 대부분의 시간 동안 유휴 상태가 됩니다.
찾기 select
및 시스템 호출 poll
:epoll