2017-11-28 10 views
8

우리는 무작위로 높은 크롬을 가지고있는 content download 시간을 갖는 API를 가지고 있습니다. 항상 파이어 폭스에서 잘 작동하며 단지 약간만 걸립니다. ms. 응답 크기는 20kb 비 압축 및 4kb 압축입니다. 같은 요청은 곱슬 곱슬을 사용하여 잘 작동합니다. 우리가 시도Chrome에서 임의로 높은 콘텐츠 다운로드 시간이 필요하십니까?

것들 :

  1. If-None-Match 헤더를 사용하지 않도록 브라우저에서 캐시 응답을 비활성화합니다.
  2. 다양한 압축 시도 (gzip, deflate, br).
  3. 압축 해제.
  4. 모든 크롬 확장을 사용 중지합니다.

동일한 요청은 크롬에서 가끔씩 제대로 작동하지만 무작위로 매우 높은 콘텐츠 다운로드 시간을 반환합니다.

이 문제의 근본 원인을 이해할 수 없습니다. 이 시간을 최소화하기 위해 우리가 시도 할 수있는 다른 것들은 무엇입니까?

Chrome Network Tab

나는 여기에 세 가지 요청을 만들어 3 한 (마지막 스파이크 전) 대부분의 시간을 보냈다. CPU가 더 긴 시간 동안 최대 값을 초과하지 않는 것처럼 보입니다. 대부분의 시간은 유휴 시간입니다. Replay XHR 메뉴를 사용하여 전화를 재생하면

performance graph chrome

또한, 컨텐츠의 다운로드 기간은 200 밀리 초에 2 초에서 떨어진다.

답변

11

우연히 무한 스크롤을 구현하려고합니까?마우스 휠을 사용하는 대신 스크롤 막대를 드래그 해보십시오. 어떤 이유로 Chrome은 마우스 스크롤 이벤트로 어려움을 겪고있는 것 같습니다. 스크롤 막대가 잘 작동하면 계속 읽으십시오. 내가 AJAX 요청을 트리거 것 scroll 이벤트에 감시자를 부착했다 https://github.com/TryGhost/Ghost/issues/7934

-

이 포스팅은 비슷한 경험 누군가의 상세한 연습을 제공합니다. 나는 요청을 줄였으며 단지 1 명이 보내 졌음을 알 수 있었다. 내 dev에 서버가 몇 ms 이내에 응답을 반환 봤지만 크롬에 2 초 지연이있을 것입니다. 렌더링, API 호출 없음, 아니요 및 스크립트 실행 중. 그러나 "콘텐츠 다운로드"는 14kb에 3 초가 걸릴 것입니다. 다른 브라우저에는이 문제가 없습니다.

나는 setTimeout 대신 requestAnimationFrame을 사용하면 문제가 해결된다는 제안을 발견했습니다. 이러한 접근 방식은 "대기 중"또는 녹색이 중요 할 때 접근 방식이 작동하는 것처럼 보이며 "내용 다운로드"또는 파란색은 그렇지 않습니다.

파기 시간이 지난 후에 조건부로 mousewheel 이벤트에서 e.preventDefault()을 호출 해 보니 놀랍게도 효과가있었습니다. 주의 할

몇 가지 :

1) 나는 API 호출을 만들기 위해 mousewheel 이벤트를 사용하지 않았다. 나는 조절과 함께 scroll 이벤트를 사용했습니다.

2) mousewheel 이벤트는 비표준 이벤트이므로 사용하지 않아야합니다. https://developer.mozilla.org/en-US/docs/Web/Events/mousewheel

3)하지만이 경우에는 크롬 때문에 mousewheel 이벤트를보고 처리해야합니다. 다른 브라우저는 지원하지 않는 이벤트를 무시하고 다른 브라우저에서 문제가 발생하는지 아직 확인하지 못했습니다.

4) 매번 preventDefault()에 전화하기를 원하지 않으므로 마우스로 스크롤 할 수 없으므로 :) 세로 스크롤을 사용하는 경우 deltaY이 1 일 때만 전화를 걸 수 있습니다. 기본적으로 더 이상 스크롤 할 수없는 경우 첨부 된 이미지에서 deltaY이 1임을 알 수 있습니다. 페이지를 스크롤 할 수 없어도 mousewheel 이벤트가 발생합니다. 보조 노트로, 수직으로 스크롤 할 때 deltaX은 -0이고 수평으로 스크롤 할 때 deltaY은 -0입니다.

내 솔루션 : 나는 일을 본 적이하고 내가 언급이나 다른 곳에서 논의 보지 못한 유일한 솔루션을하고있다

window.addEventListener("mousewheel", (e) => { 
    if (e.deltaY === 1) { 
     e.preventDefault(); 
    } 
}) 

. 도움이되기를 바랍니다. 나는이가 크롬과 관련된 생각

console log of mousewheel event

+1

는 기능 https://www.chromestatus.com/feature/5745543795965952하는 TouchMove 같은 모바일 이벤트에 귀를 기울 될 때 일을 방지하기 위해 설계 (수동 이벤트 리스너) - 추가 모든 mousewheel 이벤트 리스너가 나를 위해이 문제를 해결했습니다 (콜백이 빈 함수 였지만). – NDavis

-1

내가 잘못 생각한 것 같습니다. ™

기본적으로 Chrome에서만 실제로 발생하는 경우 클라이언트 측 코드가 비난 받아야하며 그 중 일부는 세부 사항을 밝히지 않습니다.

그렇지 않으면, 당신은 디버깅하려고 무엇을 프런트 엔드 도구를 사용합니다 (의 nginx 태그의 선택에 따라) 백엔드 상태로 존재 :

  • 가지고 당신이 문제를 해결하려면 tcpdump(8)를 사용하여 시도 ? 어떤 패킷이 교환되고 몇시에?

  • 요청하신 시간을 기록하고 nginx에서 처리 한 적이 있습니까? 예 : $request_time?

  • 서버는 어디에 있습니까? 아마도 당신은 패킷 손실을 겪고 있는데, 이것은 임의의 지연을 가져 오는 일부 TCP 패킷의 타임 아웃과 재전송을 요구할 수 있습니다.

마지막으로, 마지막 가능성은 필드가 당신이 그것을하지 무슨 생각을 의미하지 않는다는 것입니다 - 그것은 CPU 부하에서 타격을 할 수처럼 이것은 XMLHTTPRequest (XHR)의 결과가 그대로, 사운드 처리 - 사용자 추적을 사용하여 무작위로 상당한 양의 CPU를 소비하고 메트릭을 느리게하는 광고를 실행할 수 있습니까?