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


82

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

laravel 타이밍

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


6
실행 해보세요php artisan optimize --force
Joseph Silber

13
공정하게 말하면 표시되는로드 시간은 디버깅 모드에 있습니다. 사용중인 디버그 바는 응용 프로그램을 상당히 느리게 만듭니다.
kajetons 2014

4
귀하의 환경은 어떤 모습입니까? VM에서 로컬로 개발하는 것에 비해 VPS에서 더 빠른 속도를 봅니다.
kreeves 2014-04-25

2
@Artsemis 방금 모든 것을 설치했습니다. 두 배 이상 느리고 여러 번 새로 고침 후 충돌이 발생합니다.
mpen 2014-04-26

9
예, Vagrant를 사용하여 빠른 것을 희망하지 마십시오. Symfony 페이지는 일반적으로 Vagrant에서로드하는 데 1-2 초 정도 걸리지 만 프로덕션에서는 50ms가 걸립니다.
Matthieu Napoli

답변:


98

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 호스트에서 시도하지 않았습니다.


rsync를 사용하는 것 외에 성능을 향상시키기 위해 무엇을 했습니까?
jpcamara

2
@jpcamara 아무것도. Rsync만으로는 ~ 20ms로 줄었습니다. HHVM에서 실행하고 디버깅을 끄고 artisan optimize약간의 향상을 위해 실행할 수 있습니다 . 나머지는 주로 앱을 디자인하는 방식입니다. barryvdh/laravel-debugbar느린 속도를 설치 하고 찾으 십시오 .
mpen 2014-07-25

2
20ms에 280 개의 파일을 어떻게로드합니까? 여기에 어떤 종류의 컴파일 / OPcache가 사용됩니까? SSD 스토리지 가정, ofc.
Manuel Arwed Schmidt

1
Taylor Otwell에 따르면 Laravel 5.2는 25 % 더 빨라질 것입니다 : twitter.com/taylorotwell/status/674327734252892161
Koga

1
기본 파일 대신 NFS 파일 공유를 사용하십시오. 모든 것을 10 배 빠르게 ... 파일 시스템을 NFS로 강제 마운트하도록 Vagrant 파일을 수정합니다. config.vm.synced_folder ".", "/ vagrant", 유형 : "nfs", nfs : true, nfs_udp : false, nfs_version : 3
Didzis

25

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

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

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

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

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

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

일반적인 트레이드 오프 :

 Easy = Slow, Hard = Fast

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

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

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

여기에 이미지 설명 입력


91
그 그래픽이 질문과 무슨 관련이 있습니까?
NullPoiиteя 2015 년

4
PHP7는 훨씬 빨리 PHP5보다
Cobolt

1
무슨 요점? 쉬움 = 느림은 근거없는 오해를 특정 언어로 더 퍼뜨립니다
Chris

인포 그래픽에 하나의 오류는 자바가 1991 년에 1995 년과 파이썬에서 발명 되었기 때문에 Pyhon 자바에 의해 영향을받을 수 없다는 것입니다
Haritsinh Gohil

@HaritsinhGohil Python 3는 2008 년에 출시되었습니다.
majidarif

17

예-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의 지연은 사용자를 완전히 미치게 만들 것입니다.


2
미들웨어가 말도 안되는 이유는 무엇입니까? 우리 모두가 말도 안된다고 주장 할 수 있도록 사실로 설명해 주시겠습니까? 또한 80 ~ 65ms 사이에 행복하게 응답하는 Laravel 설치를 실행합니다 (예, 40 억 개의 레코드 테이블에서 db 쿼리를 수행함).
Mjh

2
당신은 분명히 laravel을 좋아합니다. 기본 설치를 설정하고 최적화했으며 결과가 좋지 않았습니다. 사전 경로 처리를 처리하려면 미들웨어와 리버스 엔지니어링이 필요하다는 것을 알았습니다. 이상적이지 않았습니다. 최적화를 위해 "YOUR"laravel을 설치했기 때문입니다. 관련이 없습니다. 기본 패키지 라우팅 HELLO WORLD는 단순한 라우팅 프레임 워크와 나뭇 가지 템플릿 엔진보다 훨씬 무겁고 느 렸습니다. 둘 다 캐시 할 수 있습니까? 최적화 되었습니까? 향상? 예. 그게 요점인가요? 아뇨. 라 라벨은 무겁습니다. 헤비는 느립니다. 세상은 그것에 동의합니다. 당신이 그것을 좋아한다면 그것을 사용하십시오. 그러나 이것은 신학이 아닙니다. :)
Nick

1
나는 적은 시간을 보내는 것을 좋아합니다. 저는 프레임 워크 / 기술 / 무엇이든 상관하지 않습니다. 여러분도 동일하다고 가정하겠습니다. 목표 달성에 소요되는 시간 감소 = 내 책에서 승리입니다. 네, 라 라벨은 무겁습니다. 모든 프레임 워크는 베어 본 언어에 비해 무겁습니다. 모든 프로그램 / 소프트웨어와 마찬가지로 Laravel 빠르게 실행할 수 있습니다 . 프레임 워크가 도움이된다면, 더 빨리 실행해야한다면 가능합니다.
Mjh

$ 20 DO 서버에서 실행되는 구성되지 않은 / 최적화 / 캐시 된 Laravel 인스턴스를 $ 400 고도로 조정 / 최적화 / 캐시 된 서버 인프라에서 실행되는 사용자 지정 빌드, 고도로 조정 / 최적화 / 캐시 된 PHP 앱과 비교 한 다음 불평하고 있습니다. 최적화되지 않은 앱이 느린가요? 오해하지 마십시오. 모든 프레임 워크는 기본적으로 느립니다! 모두를 위해 작동하도록 프레임 워크를 조정할 수있는 방법은 없습니다. 또한 대부분의 프레임 워크는 먼저 개발 환경에 맞게 설정됩니다. 등 느린 자동 로딩, 비 캐시 템플릿, 페라리에, 사과를하지 사과 사과를 비교하십시오, 또는이 경우, 존다 ...
jacobfogg

2
CodeIgniter는 기본적으로 느리지 않습니다. 실제로 CodeIgniter는 PHP 자체만큼 빠릅니다. PHP = 300rps, CodeIgniter = 295. Laravel은 그보다 훨씬 낮습니다. Zend는 약 30rps이고 케이크는 내가 기억하는대로 무려 3rps입니다. 두 개의 프레임 워크가 동일하게 생성되지 않습니다. 살펴볼 사과가 몇 개 있습니다. 그러나 Laravel을 최적화하면 60ms의로드가 발생할 수 있습니다. CodeIgniter를 최적화하면 어떤 이점이 있는지 상상해보십시오. ;)
Webmaster G

13

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)

도움이되는 희망


1
분명하고 세션으로 파일을 사용하지 않도록 누구에게나 권장합니다. 확장 성 생각 :)
jeveloper

6
@jeveloper 뭐야? 이 예에서 파일은 데이터베이스보다 4 배 이상 빠릅니다
developerbmw

1
@Brett는 "확장 성을 생각하는"점, 가능한 원격 시스템에 대한 네트워크 호출 대 확인 파일이었다 (그 같은 VPC 내에는 경우에도) 느리지 만 것 이상 지속 가능하고 캡처 세션 데이터
jeveloper

@jeveloper는 파일 시스템이 지속 가능하지 않습니까? 어쨌든 대부분의 데이터베이스의 기본 저장소이기 때문에 그럴 수 있기를 바랍니다.
developerbmw

3
@developerbmw 그가 말하려는 것은로드 밸런서와 애플리케이션을 제공하는 다중 인스턴스가있는 경우 로컬 서버의 파일 시스템을 사용하는 것은 확장 가능하지 않다는 것입니다.
크리스 해리슨

10

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

http-response "Hello World"를 만들려면 :

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

이것이 왜 자신의 것으로 표시되었는지 모르겠습니다. 네 의견으로 더 적절할 수 있습니다. 도커 컨테이너 내에서 응답 시간이 매우 느리지 만 ~ 600ms
AndrewMcLagan

경로 캐싱을 시도 했습니까?
Oğuz Can Sertel

rps는 무엇입니까? 초당 요청?
user3494047

3
Hello world는 특히 의미있는 테스트에 사용될 때 가장 유용하고 유용한 애플리케이션입니다. 언어에 대한 패키지 / 패키지 관리자 지원에 어떤 구성 요소가 사용되는지 알 필요가있는 모든 것을 완전히 다룹니다.
Mjh

1
난 그냥 성능 기준 / O를 다른 복잡한 의존성 w 원하는
Aggarat .J

5

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

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

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

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

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


그 숫자가 확실하지 않지만 분명히 눈에.니다. "특히 최적화 된 경우"란 무엇을 의미합니까? 어떻게 최적화하고 있습니까? 달리는 것만으로도 php artisan optimize할 수있는 일이 더 있습니까?
mpen 2014-04-25


3

나는 이것이 조금 오래된 질문이라는 것을 알고 있지만 상황이 바뀌 었습니다. 라 라벨은 그렇게 느리지 않습니다. 언급했듯이 동기화 된 폴더가 느립니다. 그러나 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로 줄었습니다.


Windows 용 Bash를 통해 rsync를 사용해 보셨습니까? 실제로 지금 실행 중이며 훌륭하게 작동합니다.
mpen

아니요, 시도하지 않았습니다. 많은 사람들이 rsync가 git bash 또는 Windows cmd에서도 잘 작동한다고 씁니다. 왜 그것이 나를 위해 작동하지 않는지 모르겠습니다. 그러나 어쨌든 다른 해결책을 찾았습니다. 누군가에게 유용 할 수도 있습니다.
frutality

1

나는 직면했다 1.40s개발 영역에서 순수한 라 라벨과 함께 작업하면서 했습니다!

문제는 다음을 사용하고있었습니다 : php artisan serve웹 서버를 실행하기 위해

같은 코드 대신 아파치 웹 서버 (또는 NGINX)를 사용했을 때 153ms


1

아무도 언급하지 않았기 때문에 xdebug 디버거가 시간을 극적으로 증가 시켰다는 것을 알았습니다. 기본 "Hello World, the time is 2020-01-01T01 : 01 : 01.010101"동적 페이지를 제공하고 httpd.conf에서이를 사용하여 요청 시간을 측정했습니다.

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" **%T/%D**" combined

% T는 제공 시간 (초)이고 % D는 시간 (마이크로 초)입니다. 내 php.ini에서 다음과 같이하십시오.

[XDebug]
xdebug.remote_autostart = 1
xdebug.remote_enable = 1

나는 약 770ms의 응답 시간을 얻었지만 두 가지 모두를 비활성화하기 위해 0으로 설정하면 즉시 160ms로 점프했습니다. 이 두 가지를 모두 실행하면 120ms로 단축되었습니다.

php artisan route:cache
php artisan config:cache

단점은 구성 또는 경로를 변경하면 다시 캐시해야한다는 점입니다.

참고로, 이상하게도 SSD에서 회전하는 HDD로 사이트를 이동하는 것은 성능상의 이점을 제공하지 않았는데, 이는 나에게는 매우 이상하지만 캐시 된 것 같습니다. 저는 XAMPP를 사용하는 Windows 10을 사용하고 있습니다.


-11

Laravel은 대부분의 경우 웹 페이지에 PHP를 사용하는 것이 느리기 때문에 느립니다.

Laravel을 사용하면 모든 호출에서 전체 프레임 워크가 다시 빌드됩니다. 이것이 모든 페이지가 index.php를 가리키는 이유입니다. 전체 프레임 워크는 PHP 스크립트이므로 매번 PHP 인터프리터를 거쳐야합니다. 프레임 워크가 클수록 더 오래 걸립니다.

이것을 서버가 초기화 코드를 한 번 실행하면 결국 모든 페이지가 네이티브 코드 (JIT 이후)가되는 "서버 환경"(예 : tomcat)과 대조됩니다.

참고로 동일한 하드웨어, OS 등을 사용하여이 하드웨어에서 JSP를 사용하는 간단한 'hello world'는 3000rps, laravel의 동일한 hello world는 51rps입니다.

프레임 워크 오버 헤드 및 코어 당 최대 RPS를 테스트하는 가장 쉬운 방법은 동적 (정적 페이지 캐싱을 피하기 위해) 간단한 'hello world'와 함께 Apache AB와 동시성 값 1을 사용하는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.