[performance] 라 라벨이 정말 이렇게 느린가요?

방금 라 라벨을 사용하기 시작했습니다. 아직 코드를 거의 작성하지 않았지만 페이지를로드하는 데 거의 1 초가 걸립니다!

laravel 타이밍

프레임 워크가없는 앱과 NodeJS 앱이 ~ 2ms가 소요될 때 이것은 저에게 약간 충격적입니다. 라 라벨은 무엇을하고 있습니까? 이것은 정상적인 행동이 아닙니다. 미세 조정이 필요합니까?



답변

Laravel은 실제로 그렇게 느리지 않습니다 . 500-1000ms는 터무니 없습니다. 디버그 모드에서 20ms로 줄였습니다.

문제는 Vagrant / VirtualBox + 공유 폴더였습니다. 나는 그들이 그러한 성능 타격을 입었다는 것을 깨닫지 못했습니다. Laravel에는 너무 많은 종속성 (~ 280 개의 파일로드)이 있고 각 파일 읽기가 느리기 때문에 추가 속도가 매우 빠릅니다.

kreeves는 저를 올바른 방향으로 안내했습니다. 이 블로그 게시물 은 공유 폴더를 사용하는 대신 파일을 VM으로 재 동기화 할 수있는 Vagrant 1.5의 새로운 기능을 설명합니다.

Windows에는 기본 rsync 클라이언트가 없으므로 cygwin 을 사용해야 합니다. 그것을 설치하고 Net / rsync를 확인하십시오. C:\cygwin64\bin경로에 추가 하십시오. [또는 Win10 / Bash에 설치할 수 있습니다.]

Vagrant는 새로운 기능을 소개합니다 . 나는 Puphet을 사용하고 있으므로 Vagrantfile이 약간 재미있어 보입니다. 다음과 같이 조정해야했습니다.

  data['vm']['synced_folder'].each do |i, folder|
    if folder['source'] != '' && folder['target'] != '' && folder['id'] != ''
      config.vm.synced_folder "#{folder['source']}", "#{folder['target']}",
        id: "#{folder['id']}",
        type: "rsync",
        rsync__auto: "true",
        rsync__exclude: ".hg/"
    end
  end

모든 설정이 완료되면 vagrant up. 모든 것이 순조롭게 진행되면 컴퓨터가 부팅되고 모든 파일을 복사해야합니다. vagrant rsync-auto파일을 최신 상태로 유지하려면 터미널에서 실행해야 합니다. 약간의 지연 시간을 지불하지만 30 배 빠른 페이지로드를 위해서는 그만한 가치가 있습니다!


PhpStorm을 사용하는 경우 자동 업로드 기능이 rsync보다 더 잘 작동합니다. PhpStorm은 파일 감시자를 방해 할 수있는 많은 임시 파일을 생성하지만 업로드 자체를 처리하게하면 잘 작동합니다.


한 가지 더 옵션은 lsyncd 를 사용하는 입니다. Ubuntu 호스트-> FreeBSD 게스트에서 이것을 사용하여 큰 성공을 거두었습니다. 아직 Windows 호스트에서 시도하지 않았습니다.


답변

문제 해결을 위해 laravel 제작을 최적화하는 방법에 대해 설명하는 이 블로그 를 찾았습니다 . 앱을 빠르게 만들기 위해해야하는 대부분의 작업은 이제 코드의 효율성, 네트워크 용량, CDN, 캐싱, 데이터베이스에 달려 있습니다.

이제 문제에 대해 이야기하겠습니다.

Laravel은 기본적으로 느립니다. 이를 최적화하는 방법이 있습니다. 또한 코드에서 캐싱을 사용하여 서버 시스템을 개선 할 수도 있습니다. yadda yadda yadda. 그러나 결국 Laravel은 여전히 ​​느립니다.

Laravel은 많은 심포니 라이브러리를 사용하며 techempower의 벤치 마크 에서 볼 수 있듯이 심포니 순위는 매우 낮습니다. laravel 벤치 마크 가 거의 바닥에 있음을 찾을 수도 있습니다 .

많은 자동 로딩이 백그라운드에서 발생하며 필요하지 않을 수도있는 것이 로딩됩니다. 기술적으로 laravel은 사용하기 쉽기 때문에 앱을 빠르게 빌드하는 데 도움이되며 속도도 느려집니다.

그러나 나는 Laravel이 나쁘다는 것을 말하는 것이 아닙니다. 그것은 많은 일에서 위대합니다. 그러나 높은 트래픽 급증이 예상되는 경우 요청을 처리하기 위해 더 많은 하드웨어가 필요합니다. 더 많은 비용이들 것입니다. 그러나 당신이 불결한 부자라면 라라 벨로 무엇이든 이룰 수 있습니다. :디

일반적인 트레이드 오프 :

 Easy = Slow, Hard = Fast

나는 C 또는 Java가 어려운 학습 곡선과 어려운 유지 관리 성을 가지고 있다고 생각하지만 웹 프레임 워크에서 매우 높은 순위를 차지합니다.

너무 관련이 없지만. 나는 단지 요점을 증명하려고 노력하고 있습니다 easy = slow.

Ruby는 유지 관리 및 학습 용이성에서 매우 좋은 평판을 얻었지만 여기에 표시된 것처럼 Python과 PHP 중에서 가장 느린 것으로 간주됩니다 .

여기에 이미지 설명 입력


답변

예-Laravel은 정말 느립니다. 이를 위해 POC 앱을 구축했습니다. 로그인 양식이있는 간단한 라우터. $ 20 디지털 오션 서버 (몇 GB 램)에서 10 개의 동시 연결로 60 RPS 만 얻을 수있었습니다 .

설정:

2gb RAM
Php7.0
apache2.4
mysql 5.7
memcached server (for laravel session)

최적화, composer dump autoload 등을 실행했고 실제로 RPS를 43-ish로 낮췄습니다 .

문제는 앱이 200 ~ 400ms에 응답한다는 것입니다. laravel이 켜져있는 로컬 컴퓨터에서 AB 테스트를 실행했습니다 (예 : 웹 트래픽을 통하지 않음). 112 RPS 만 얻었습니다. 평균 300ms의 응답 시간이 200ms 더 빠릅니다.

비교적, 저는 AWS t2.medium (x3,로드 밸런싱)에서 하루에 수백만 건의 요청을 실행하는 프로덕션 PHP 네이티브 앱을 테스트했습니다. ELB를 통해 웹을 통해 로컬 컴퓨터에서 해당 컴퓨터로 25 개의 동시 연결을 AB를 수행했을 때 약 1200 RPS를 얻었습니다. 로드가있는 시스템과 laravel “로그인”페이지에서 큰 차이가 있습니다.

세션 (elasticache / memcached), 라이브 DB 조회 (memcached를 통한 캐시 된 쿼리), CDN을 통해 가져온 자산 등이 포함 된 페이지입니다.

내가 말할 수있는 것은, laravel은 사물에 대해 약 200-300ms의로드를 유지합니다. 결국 PHP 생성 뷰에서는 이러한 지연 유형이로드시 허용됩니다. 그러나 Ajax / JS를 사용하여 작은 업데이트를 처리하는 PHP 뷰의 경우 느리게 느껴지기 시작합니다.

200 개의 봇이 동시에 100 페이지를 크롤링하는 동안 멀티 테넌트 앱으로이 시스템이 어떻게 보일지 상상할 수 없습니다.

Laravel은 간단한 앱에 적합합니다. Lumen은 미들웨어 말도 안되는 일 (IE, 멀티 테넌트 앱 및 사용자 지정 도메인 등)이 필요한 멋진 작업을 수행 할 필요가없는 경우 허용됩니다.

그러나 나는 “hello world”포스트에 대해 300ms의로드를 발생시킬 수있는 것으로 시작하는 것을 결코 좋아하지 않습니다.

“누가 신경써?”라고 생각한다면

.. 빠른 쿼리를 사용하여 수십만 개의 결과에 대한 자동 완성 제안에 응답하는 예측 검색을 작성합니다. 200-300ms의 지연은 사용자를 완전히 미치게 만들 것입니다.


답변

Laravel 4를 사용하면 가장 큰 속도 향상을 얻을 수 있으며 올바른 세션 드라이버를 선택할 수 있습니다.

Sessions "driver" file;

Requests per second:    188.07 [#/sec] (mean)
Time per request:       26.586 [ms] (mean)
Time per request:       5.317 [ms] (mean, across all concurrent requests)


Session "driver" database;

Requests per second:    41.12 [#/sec] (mean)
Time per request:       121.604 [ms] (mean)
Time per request:       24.321 [ms] (mean, across all concurrent requests)

도움이되는 희망


답변

내 Hello World 콘테스트에서 라 라벨은 무엇입니까? 추측 할 수 있다고 생각합니다. 테스트를 위해 도커 컨테이너를 사용했으며 결과는 다음과 같습니다.

http-response “Hello World”를 만들려면 :

  • 로그 핸들러 stdout이있는 Golang : 6000rps
  • 로그 핸들러 표준 출력이있는 SpringBoot : 3600rps
  • 로그 오프 라 라벨 5 : 230rps


답변

저는 Laravel을 꽤 많이 사용하며 브라우저에서 측정 한 엔드 투 엔드 렌더링이 요청에서 준비까지의 총 시간이 더 짧다는 것을 보여주기 때문에 그것이 알려주는 숫자를 믿지 않습니다.

또한 직장에서 내 컴퓨터에서 약간 더 많은 숫자를 얻으므로 집에있는 컴퓨터보다 눈에 띄게 빠르게 페이지를 실행합니다.

나는 그 숫자가 어떻게 계산되는지 모르지만 관찰이나 Firebug와 같은 브라우저 도구로 확증되지는 않습니다.

Laravel은 특히 최적화되었을 때 실제로 그렇게 느리지 않습니다. 그러나 메모리가 부족합니다. 매우 느린 Drupal과 같은 무거운 CMS조차도 Laravel이 요청하는 베어 본의 메모리 사용량의 약 1/3을 차지하는 것으로 보입니다.

따라서 프로덕션에서 Laravel을 실행하기 위해 CPU 최적화 서버보다 먼저 메모리 최적화 서버에 배포했습니다.


답변

나는 이것이 조금 오래된 질문이라는 것을 알고 있지만 상황이 바뀌 었습니다. 라 라벨은 그렇게 느리지 않습니다. 언급했듯이 동기화 된 폴더가 느립니다. 그러나 Windows 10에서는 rsync. 나는 cygwinminGW. 의 버전 rsync과 호환되지 않는 것 같습니다 .git for windowsssh

나를 위해 일한 것은 다음과 같습니다. NFS .

방랑 문서 말한다 :

NFS 폴더는 Windows 호스트에서 작동하지 않습니다. Vagrant는 Windows에서 NFS 동기화 폴더에 대한 요청을 무시합니다.

이것은 더 이상 사실이 아닙니다. 요즘 vagrant-winnfsd 플러그인 을 사용할 수 있습니다 . 설치는 정말 간단합니다.

  1. 실행 vagrant plugin install vagrant-winnfsd
  2. 변경 사항 Vagrantfile:config.vm.synced_folder ".", "/vagrant", type: "nfs"
  3. 추가 Vagrantfile:config.vm.network "private_network", type: "dhcp"

그게 내가 만드는 데 필요한 전부입니다 NFS 입니다. Laravel 응답 시간은 500ms에서 100ms로 줄었습니다.