2010-02-27 6 views
4

내가 작업하는 곳에서는 라이브러리 및 라이브러리에 구축 된 몇 가지 복잡한 프로그램을 빌드하고 배포합니다. 모든 코드는 C로 작성되었으며 Windows, Linux, Aix, Solaris, Darwin과 같은 대부분의 '표준'시스템에서 사용할 수 있습니다. 파일 설명자 제한 및 기본 스택 크기

나는 품질 보증 부서에서 시작되어 실행 테스트는 최근에 내가 파일 디스크립터 제한을 설정 기억할 필요가 여러 번 생각 나게되었고, 기본 스택 크기 동안 높거나 나쁜 일이 일어날 것입니다. 특히 솔라리스와 지금은 다윈의 경우입니다. 내가 0 필요한 환경에서 신자는 제품 작동하도록 하구이기 때문에

지금이 나에게 매우 이상하다. 그래서 나는 이런 종류의 요구 사항이 필요한 악이며, 우리가 뭔가 잘못하고있는 경우가 있는지 궁금합니다.

편집 :

문제를 설명하는 간단한 설명과 배경이 약간 있습니다. 그러나 나는 그 질문에 대해 충분히 말하지 않았다. 현재 우리는 코드를 실행하기 전에 이러한 제한을 설정하기 위해 고객과 이에 따른 테스터를 요구합니다. 우리는 프로그램 적으로 이것을하지 않습니다. 그리고 이것은 정상적인 부하 하에서 프로그램이 다 소모되어 오류가 발생하는 상황이 아닙니다. 질문을 다시 한 번 말하면 고객이 소프트웨어를 Solaris, Aix와 같은 일부 플랫폼에서 실행되도록 실행하기 위해 이러한 ulimit 값을 변경하도록 요구하고 있습니까? 아니면 이러한 사용자가 쉽게 접근 할 수없는 회사입니까?

바운티 : 나는 다른 회사가 이러한 한계를 관리하기 위해 무엇을하고 있는지에 대한 정보를 얻기 위해 바운티를 추가했습니다. 실용적으로 이것을 설정할 수 있습니까? 우리가해야할까요? 우리의 프로그램이 이러한 한계를 극복해야만 하는가? 아니면 이것이 사안에 약간 지저분한 징후 일 수 있는가? 그것은 내가 뭘 알고 싶은지, 완벽 주의자처럼 보이지만 더러운 프로그램은 정말로 나를 괴롭힌다. 다윈에

+1

는 지금까지 스택 크기의 이동으로 - 작은 최대 스택 크기는 더 많은 스레드는 가상 메모리 부족 실행하기 전에 할 수 있습니다. 종종 32 비트 시스템에서 중요합니다. 64 비트 시스템에서는 그다지 중요하지 않습니다. –

답변

7

당신이 필요로하는 경우 QA 테스트를 실행하기 위해이 값을 변경하려면 너무 많은 문제가되지 않습니다. 그러나 고객이 프로그램을 실행하기 위해이를 수행하도록 요구하면 (IMHO) 피해야합니다. 다른 값이 없으면이 값을 설정하고 응용 프로그램을 시작하는 래퍼 스크립트를 작성하여 사용자가 원 클릭 응용 프로그램을 시작할 수 있도록하십시오. 그러나 이들을 프로그램 내에서 설정하는 것이 바람직한 방법입니다. 최소한 프로그램이 실행될 때 제한을 점검하고 한계가 너무 낮 으면 일찍 오류가 발생하도록하십시오.

소프트웨어 개발자가 프로그램을 실행하기 위해 스택과 디스크립터 제한을 망쳐야한다고 말하면 소프트웨어에 대한 내 인식이 바뀌게됩니다. "왜 그들이 가지고있는 소프트웨어의 모든 다른 부분에 대해 허용되는 시스템 제한을 초과해야합니까?"라고 생각하게 만듭니다. 이것은 유효한 관심사 일 수도 있고 아닐 수도 있지만, (많은 사람들에게) 해킹처럼 보일 수있는 무언가를하도록 요청받는 것은 여러분이 막 발사하고가는 프로그램과 같은 전문적인면을 가지고 있지 않습니다.

"이 프로그램이 정상적으로 실행되면 프로그램이 고갈되어 seg fault가 발생할 수있는 상황이 아닙니다."라고 말하면이 문제는 더욱 심각해질 것입니다. 이러한 제한을 초과하는 프로그램은 한 가지이지만, 이러한 제한을 초과하여 발생하는 오류 조건을 정상적으로 처리하지 못하는 프로그램은 완전히 다릅니다. 파일 핸들 제한에 도달하여 파일을 열려고하면 너무 많은 파일이 열려 있음을 나타내는 오류가 발생합니다. 이렇게하면 잘 설계된 프로그램에서 프로그램이 중단되지 않아야합니다. 스택 사용 문제를 감지하는 것이 더 어려울 수 있지만 파일 설명자가 부족하면 충돌이 발생하지 않아야합니다.

이 유형의 프로그램에 대해 자세히 설명하지는 않지만 프로그램 사용자가이 값을 변경하는 데 필요한 적절한 권한이 있다고 가정하는 것이 안전하지 않다고 주장합니다. 어쨌든 사용자가 알지 못하는 사이에 프로그램이 실행되는 동안 다른 값이 변경되지 않는다고 가정하는 것이 안전하지 않을 수도 있습니다.

항상 예외가 있지만 일반적으로 이러한 제한을 초과하는 프로그램의 코드를 다시 검사해야한다고 말합니다. 한계는 이유가 있기 때문에 시스템에있는 거의 모든 소프트웨어가 그 한계 내에서 문제없이 작동합니다. 동시에 많은 파일을 열어 놓아야합니까? 아니면 몇 개의 파일을 열고 처리하고 닫은 다음 몇 가지 더 열려면 더 깨끗합니까? 라이브러리/프로그램이 하나의 큰 번들로 너무 많은 것을 시도하고 있습니까? 아니면 함께 작동하는 더 작고 독립적 인 부분으로 나누는 것이 낫습니다. 비 재귀 적 방식으로 다시 작성할 수있는 심층적 인 알고리즘을 사용하기 때문에 스택 제한을 초과합니까? 시스템 자원 제한을 변경할 필요성을 완화하기 위해 문제의 라이브러리 및 프로그램을 개선 할 수있는 많은 방법이있을 수 있습니다.

+1

당신은 기본적으로 뭔가를 실행하기 전에 내가 ulimit x y를 타이핑 할 때마다 삐걱 거리는 것에 대한 나의 이유 중 하나 하나를 치다. 다행이 아니라 기쁘다. 잘 설계된 프로그램에서 이러한 한계는 결코 문제가되지 않아야합니다. 내 회사의 엔지니어는 이러한 앱이 고성능이어야하고 반환 값을 확인하는 데 시간을 낭비해야한다고 말함으로써이를 극복합니다. 사용자가 잘못된 설정을 가지고 있기 때문에 프로그램이 segfaults를하면 ... 적어도 내가 제안한 것처럼 코드 청결 상태를 거부하는 이유입니다. – Charles

+3

"이러한 앱은 고성능이어야하며 반환 값을 확인하는 데 시간 낭비가 있습니다."나는 그 말을 분명히 터무니없는 것으로 간주합니다.때로는 내가 사용하는 임베디드 개발자들도 똑같은 얘기를 들었습니다. 리소스가 제한된 임베디드 세계에서도이 말은 거의 사실이 아닙니다. 프로그램이 충돌하는 경우 어떤 프로그램도 성능이 우수하지 않습니다. 오류 검사를 수행하면 약간의 오버 헤드가 추가되지만 코드를 최적화하는 데 시간을 투자하면 성능 보완이 될 것입니다. 코드를 수정하고 싶지 않기 때문에 사용자가 농구를 뛰어 넘을 필요가 없습니다. – bta

+0

"사용자가 잘못된 설정을 가지고 있기 때문에 프로그램의 segfaults가 발생하는 경우"사용자의 설정이 무엇인지 추측하지 마십시오. 사용자가 설정을 제어하지 못할 수도 있습니다. 시스템 제한은 보안상의 이유로 부분적으로 존재합니다 (시스템이 끊어 지더라도 시스템이 손상되지 않습니다). 사용자가 이러한 한계를 확장하도록 강요하면 시스템 안정성이 저하됩니다. 이 라이브러리/응용 프로그램은 의료 장비 또는 안전에 중요한 시스템에 사용되지 않는다고 말해주십시오. – bta

1

는 열려있는 파일의 수에 대한 기본 소프트 제한은 256; 기본 하드 제한은 무제한입니다.

이 AFAICR, Solaris에서, 열린 파일의 수에 대한 기본 소프트 제한은 16384이고 하드 제한 스택 크기 32768

이며, 다윈은 65,536분의 8,192 KB 소프트/하드 한계가있다. 나는 솔라리스에 한계가 있다는 것을 잊는다. (솔라리스 머신을 사용할 수 없다. - Poughkeepsie, NY의 정전으로 캘리포니아에있는 내 집에서 캔사스의 머신에 액세스 할 수 없다.).

나는 하드 한계에 대해 걱정하지 않을 것입니다. 라이브러리에 256 개의 파일 설명자가없는 것 같으면 Darwin의 소프트 제한을 늘립니다. 아마 솔라리스에 신경 쓰지 않을 것입니다.

유사 한계는 리눅스와 AIX에 적용됩니다. 나는 윈도우에 대해 대답 할 수 없다.

슬픈 이야기 : 몇 년 전, 프로그램에서 최대 파일 크기 제한을 변경 한 코드가 삭제되었습니다. 2MB가 큰 파일 일 때 변경되지 않았기 때문에 (일부 시스템에는 소프트 한도는 0.5MB). 한때 10 년 전과 전보다 실제로 한도가 증가했습니다. 그것이 제거되었을 때, 그것은 한계를 줄 였기 때문에 짜증나게했다. Tempus fugit와 그 모든 것.

수세 리눅스 (SLES 10)에

, 열린 파일 제한 4,096분의 4,096이며, 스택 한계는 8192/무제한입니다.

1

짧은 대답은 다음과 같습니다 유연성이 정상 만이 아니다.물론 불량 프로세스 나 사용자가 리소스 시스템을 굶기는 것을 방지하기위한 제한이 있습니다. 데스크톱 시스템은 서버 시스템보다 덜 제한적이지만 특정 제한이 있습니다 (예 : 파일 핸들러).

이는 사용자의 재량에 따라 사용자가 임의로/영구적으로 변경할 수있는 제한 사항을 의미하지 않습니다. 프로그램 /가 파일 핸들 많은 양의 (예를 들어 setsysinfo(SSI_FD_NEWMAX,...)을 필요로한다는 확신으로 알고 라이브러리), 스택 내에서 프로그래밍 방식 .profile의 관련 ulimit 전화) 또는 추가 (pthread와 생성 시간) 제공 등

1

많은 수의 다른 시스템을 지원해야하므로 시스템간에 기본값이 다를 수 있으므로 시스템 제한/리소스에 적합한 값으로 설정하는 것이 좋습니다.

pthread 스택의 기본 크기는 이와 같은 경우입니다. 나는 최근에 HPUX11.31의 기본값이 256KB (!) 인 것을 알아야만했습니다. 이는 우리 응용 프로그램에 대해서는별로 합리적이지 않습니다.

잘 정의 된 값을 설정하면 모든 플랫폼에 X 파일 설명자, 스택 크기 Y 등이 있는지 확인할 수 있으므로 응용 프로그램의 이식성이 향상됩니다.

나는 사용자가 (사람이 항상 래퍼 스크립트없이 바이너리를 실행하려고) 망치 적은 것을 가지고로서 프로그램 자체 내에서 설정 등의 제한에 관한 경향이있다. 선택적으로 런타임 사용자 정의를 허용하려면 환경 변수를 사용하여 기본값을 무시할 수 있습니다 (여전히 최소 한계를 적용 함).

+0

나는 좋은 값을 알고있는 앱 설정에 대한 아이디어가 마음에 든다. – Charles

0

작은 팁 : 당신이 64 비트 프로세서를 통해 응용 프로그램을 실행하려는 경우, 스택 크기 제한 설정에 대한주의하시기 바랍니다. 어느 64 비트 리눅스 시스템에서 스택 크기로 -1을 제공합니다.

감사 시암

1

은 이런 식으로 볼 수 있습니다. 고객이 이러한 제한을 설정하도록 요구하는 것은 고객에게 친숙하지 않습니다. 다른 대답에 자세히 나와 있듯이, 당신은 소프트 한도에 부딪 힐 가능성이 높습니다. 따라서 실제 응용 프로그램을 시작하는 스크립트에서 필요한 경우 자동으로 변경하십시오 (하드 한계가 너무 낮 으면 segfault 대신 좋은 오류 메시지가 표시되도록 작성하여 작성할 수도 있습니다).

그게 현실적인 부분입니다. 응용 프로그램이 무엇인지 알지 못해도 나는 약간 추측 할 만하다. 그러나 대부분의 경우에는 (진보적이지 않은) 운영 체제의 기본 제한을 벗어나지 않아야합니다. 시스템이 요청에 포격당한 서버가 아니라고 가정하면 (따라서 많은 양의 파일/소켓 핸들이 사용된다) 아마도 프로그래밍이 엉성한 신호 일 것이다. 프로그래머의 경험을 바탕으로 필자는 한 번만 읽거나 쓰는 파일에 대해 파일 설명자가 열려 있거나 산발적으로 변경되거나 읽혀지는 파일에 파일 설명자를 열어 두었다고 추측합니다. 스택의 크기에 관한

, 즉 두 가지를 의미 할 수있다. 스택이 부족한 프로그램의 표준 원인은 제한이 실제로 처리하도록 설계된 오류 조건 인 과도한 재귀 (또는 제한없는 재귀)입니다. 두 번째로 힙 메모리에 할당되어야하는 스택에 일부 큰 (아마도 구성) 구조가 할당된다는 것입니다. 그것은 심지어 더 나빠질 수 있으며 그 거대한 구조는 (참조 대신에) 가치에 의해 전달되고 있으며 이는 사용 가능한 (낭비되는) 스택 공간과 큰 성능 패널티에 큰 타격을 줄 것입니다.

0

아마 당신은 'ulimit를 -n -S 4096'과 같이 시작 스크립트에 적합한 무엇이든지 추가 할 수 있습니다.

그러나

는 rlim_fd_cur을 수정하고 영구적으로/etc/system에을의 rlim_fd_max하기 위해 2.6부터 솔라리스는 드문 일이 아니다 근무하는 데. 이전 버전의 Solaris에서는 웹 서버 실행과 같은 일부 작업 부하의 경우 너무 작습니다.