2016-06-02 6 views
1

나는 this 기사를 읽습니다. 내 우려는 autoloadrequire의 이점입니다. 기사를 읽으면서, 내가 모으는 것은 하나의 스레드가 아직 메모리에없는 객체를로드하려고 시도 할 수 있기 때문에 다중 스레드 서버에 autoload을 사용하는 것이 좋지 않다는 것입니다.다중 프로세스 포크 서버에서 Ruby 2로 '자동로드'하는 것이 더 좋습니까?

이 기사에서는 다중 프로세스 서버는 무엇이라고 말합니까? 자동로드가 좋은가요? 그렇다면 그것이 달려 있다고 말한다. 서버가 Phusion Passenged와 같은 fork (각 요청에 대해 새 프로세스를 생성 함)를 사용하고 Ruby 2를 사용하는 경우 자동로드가 도움이되지 않습니다.

이유는 Ruby 2가 copy-on-write 의미 체계를 사용하기 때문입니다. 즉 requireautoload보다 낫게 사용하는 것이 좋습니다. copy-on-write 의미론을 가지고 부팅 할 때 Foo::Bar을로드하면 모든 프로세스간에 하나의 복사본 Foo::Bar이 공유됩니다. 따라서 큰 메모리 사용량은 없습니다.

그러나 우리가 Ruby 2를 사용하지 않고 fork를 사용하는 다중 프로세스 서버를 사용하지 않으면 각 프로세스는 Foo::Bar 사본을로드하여 더 높은 메모리 사용량을 초래할 수 있습니다. 따라서,이 경우 autoloadrequire 인 것이 바람직하다.

내 기사의 해석이 맞습니까?

답변

1

나는 당신이 그것을 가지고 생각하지만, 점의 몇 명확하게하기 위해 재 작성 좋은 것 :

  1. 중요한 구분이 확실히 require 사이 autoload 그러나 열망과 게으른 사이입니다 로드. 열망하는로드는 스레드 안전성과 메모리를 효율적으로 사용할 수 있지만 포크에서는 서버 시작 속도가 느려집니다. 지연로드는 스레드 안전성이나 포크 할 때 메모리 효율이 아니지만 빠른 서버 시작을 허용합니다. require 또는 autoload와 함께 Rails eager_autoload eager load; autoload 자체적으로 느린로드. 마음에 위의와

  2. 가 다른 서버와 루비 버전은 게으르고 열망 로딩 다른 문제 제기 : 스레딩 서버에서

    • 을, 게으른 로딩이 안전하지 않은, 그래서 열망 로딩이 필요합니다 (에헴)입니다.
    • 이벤트가 발생하는 서버에서는 지연로드가 좋으므로 빠른 서버 시작을 위해 지연로드가 발생할 수 있습니다.
    • 포킹 서버에서 지연로드는 안전하지만 메모리 비효율적입니다.
      • 루비 < 2는 복사시 복사를 지원하지 않기 때문에 열심히로드하는 것도 메모리 비효율적입니다. 그래서 당신은 느슨하게로드 할 수 있습니다. (실제로 현재 Ruby로 업그레이드해야합니다.)
      • Ruby> = 2에서 열심히로드하는 것은 copy-on-write이므로 이점이 있으므로 메모리 효율적입니다.