Potential jank caused by a mojo message handler |
|
Issue descriptionWe collected slow reports from users facing janks and found that the function mentioned above is taking too much time on the main thread, potentially causing janks. The issue can be found in reports: // MediaRouterAndroidBridge() 60c97cb9cea9221e ,1476.603 45b29788bb0fb2df ,1162.389 // FeedNetworkBridge::OnResult 47203c5cf9f7e3ad ,915.528 d441787efd79b2a2 ,231.865 // NotificationResourcesDataView::ReadBadge<SkBitmap> 126f9019a38b7a02 ,341.332 fe7c12d401f08431 ,266.736 Go to crash/ReportID to view the traces. The most common stack traces: media_router::MediaRouterAndroidBridge::MediaRouterAndroidBridge(media_router::MediaRouterAndroid*) media_router::MediaRouterAndroid::MediaRouterAndroid(content::BrowserContext*) media_router::MediaRouterFactory::BuildServiceInstanceFor(content::BrowserContext*) const BrowserContextKeyedServiceFactory::BuildServiceInstanceFor(base::SupportsUserData*) const KeyedServiceFactory::GetServiceForContext(base::SupportsUserData*, bool) CastRemotingConnector::Get(content::WebContents*) CastRemotingConnector::CreateMediaRemoter(content::RenderFrameHost*, mojo::InterfacePtr<media::mojom::RemotingSource>, mojo::InterfaceRequest<media::mojom::Remoter>) ChromeContentBrowserClient::CreateMediaRemoter(content::RenderFrameHost*, mojo::InterfacePtr<media::mojom::RemotingSource>, mojo::InterfaceRequest<media::mojom::Remoter>) _ZN7content12_GLOBAL__N_118RemoterFactoryImpl6CreateEN4mojo12InterfacePtrIN5media5mojom14RemotingSourceEEENS2_16InterfaceRequestINS5_7RemoterEEE$0d23968f3b9b341f816f8f9299dfe39e media::mojom::RemoterFactoryStubDispatch::Accept(media::mojom::RemoterFactory*, mojo::Message*) mojo::InterfaceEndpointClient::HandleIncomingMessageThunk::Accept(mojo::Message*) mojo::internal::MultiplexRouter::ProcessIncomingMessage(mojo::internal::MultiplexRouter::MessageWrapper*, mojo::internal::MultiplexRouter::ClientCallBehavior, base::SequencedTaskRunner*) mojo::internal::MultiplexRouter::Accept(mojo::Message*) mojo::Connector::ReadSingleMessage(unsigned int*) mojo::Connector::OnHandleReadyInternal(unsigned int) mojo::SimpleWatcher::OnHandleReady(int, unsigned int, mojo::HandleSignalsState const&) base::debug::TaskAnnotator::RunTask(char const*, base::PendingTask*) base::MessageLoopImpl::DoWork() base::MessagePumpForUI::OnNonDelayedLooperCallback() base::(anonymous namespace)::NonDelayedLooperCallback(int, int, void*) Java_Helper_onObjectResultFromNative(_JNIEnv*, base::android::JavaRef<_jobject*> const&, base::android::JavaRef<_jobject*> const&) (.llvm.15103438533664174642) feed::FeedNetworkBridge::OnResult(base::android::ScopedJavaGlobalRef<_jobject*> const&, int, std::__ndk1::vector<unsigned char, std::__ndk1::allocator<unsigned char> >) base::internal::Invoker<base::internal::BindState<void (feed::FeedNetworkBridge::*)(base::android::ScopedJavaGlobalRef<_jobject*> const&, int, std::__ndk1::vector<unsigned char, std::__ndk1::allocator<unsigned char> >), base::WeakPtr<feed::FeedNetworkBridge>, base::android::ScopedJavaGlobalRef<_jobject*> >, void (int, std::__ndk1::vector<unsigned char, std::__ndk1::allocator<unsigned char> >)>::RunOnce(base::internal::BindStateBase*, int, std::__ndk1::vector<unsigned char, std::__ndk1::allocator<unsigned char> >&&) base::OnceCallback<void (bool, std::__ndk1::basic_string<unsigned short, base::string16_internals::string16_char_traits, std::__ndk1::allocator<unsigned short> > const&)>::Run(bool, std::__ndk1::basic_string<unsigned short, base::string16_internals::string16_char_traits, std::__ndk1::allocator<unsigned short> > const&) && feed::FeedNetworkingHost::NetworkFetchFinished(feed::NetworkFetch*, base::OnceCallback<void (int, std::__ndk1::vector<unsigned char, std::__ndk1::allocator<unsigned char> >)>, int, std::__ndk1::vector<unsigned char, std::__ndk1::allocator<unsigned char> >) base::internal::Invoker<base::internal::BindState<void (feed::FeedNetworkingHost::*)(feed::NetworkFetch*, base::OnceCallback<void (int, std::__ndk1::vector<unsigned char, std::__ndk1::allocator<unsigned char> >)>, int, std::__ndk1::vector<unsigned char, std::__ndk1::allocator<unsigned char> >), base::internal::UnretainedWrapper<feed::FeedNetworkingHost>, feed::NetworkFetch*, base::OnceCallback<void (int, std::__ndk1::vector<unsigned char, std::__ndk1::allocator<unsigned char> >)> >, void (int, std::__ndk1::vector<unsigned char, std::__ndk1::allocator<unsigned char> >)>::RunOnce(base::internal::BindStateBase*, int, std::__ndk1::vector<unsigned char, std::__ndk1::allocator<unsigned char> >&&) base::OnceCallback<void (bool, std::__ndk1::basic_string<unsigned short, base::string16_internals::string16_char_traits, std::__ndk1::allocator<unsigned short> > const&)>::Run(bool, std::__ndk1::basic_string<unsigned short, base::string16_internals::string16_char_traits, std::__ndk1::allocator<unsigned short> > const&) && feed::NetworkFetch::OnSimpleLoaderComplete(std::__ndk1::unique_ptr<std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> >, std::__ndk1::default_delete<std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > > >) base::internal::Invoker<base::internal::BindState<void (GaiaAuthFetcher::*)(std::__ndk1::unique_ptr<std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> >, std::__ndk1::default_delete<std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > > >), base::internal::UnretainedWrapper<GaiaAuthFetcher> >, void (std::__ndk1::unique_ptr<std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> >, std::__ndk1::default_delete<std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > > >)>::RunOnce(base::internal::BindStateBase*, std::__ndk1::unique_ptr<std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> >, std::__ndk1::default_delete<std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > > >&&) base::OnceCallback<void (std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > const&)>::Run(std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > const&) && _ZN7network12_GLOBAL__N_123SaveToStringBodyHandler26NotifyConsumerOfCompletionEb$8e1712ac27cd56437b19d97c577dae92 _ZN7network12_GLOBAL__N_119SimpleURLLoaderImpl16FinishWithResultEi$8e1712ac27cd56437b19d97c577dae92 network::mojom::URLLoaderClientStubDispatch::Accept(network::mojom::URLLoaderClient*, mojo::Message*) mojo::InterfaceEndpointClient::HandleIncomingMessageThunk::Accept(mojo::Message*) mojo::internal::MultiplexRouter::ProcessIncomingMessage(mojo::internal::MultiplexRouter::MessageWrapper*, mojo::internal::MultiplexRouter::ClientCallBehavior, base::SequencedTaskRunner*) mojo::internal::MultiplexRouter::Accept(mojo::Message*) mojo::Connector::ReadSingleMessage(unsigned int*) mojo::Connector::OnHandleReadyInternal(unsigned int) mojo::SimpleWatcher::OnHandleReady(int, unsigned int, mojo::HandleSignalsState const&) base::debug::TaskAnnotator::RunTask(char const*, base::PendingTask*) base::MessageLoopImpl::DoWork() base::MessagePumpForUI::OnNonDelayedLooperCallback() base::(anonymous namespace)::NonDelayedLooperCallback(int, int, void*)
,
Dec 21
For more context on the Feed size. Our response sizes are captured by ContentSuggestions.Feed.Network.ResponseSizeKB histogram. https://uma.googleplex.com/p/chrome/histograms/?endDate=20181219&dayCount=7&histograms=ContentSuggestions.Feed.Network.ResponseSizeKB&fixupData=true&showMax=true&filters=platform%2Ceq%2CA%2Cisofficial%2Ceq%2CTrue&implicitFilters=isofficial
,
Dec 21
How are you getting stack traces? I can find the offending event in the trace, but it only shows the root file/function (i.e. mojo/public/cpp/system/simple_watcher.cc/"Notify")
,
Dec 21
The following revision refers to this bug: https://chromium.googlesource.com/chromium/src.git/+/23f9b2c08f567cd8b3ab8c67bd342e2c17e271a8 commit 23f9b2c08f567cd8b3ab8c67bd342e2c17e271a8 Author: Siddhartha <ssid@chromium.org> Date: Fri Dec 21 18:47:20 2018 Add trace event to debug janks at startup The number of janks caused by mojo handlers have increased recently. The suspected feature is feed network request. Add a trace event to debug if this is the case. BUG=916791 R=fgorski@chromium.org Change-Id: I4daf735d1fc90d9488324c83f7af7b5f4990b833 Reviewed-on: https://chromium-review.googlesource.com/c/1388031 Reviewed-by: Filip Gorski <fgorski@chromium.org> Commit-Queue: ssid <ssid@chromium.org> Cr-Commit-Position: refs/heads/master@{#618559} [modify] https://crrev.com/23f9b2c08f567cd8b3ab8c67bd342e2c17e271a8/chrome/browser/android/feed/feed_network_bridge.cc |
|
►
Sign in to add a comment |
|
Comment 1 by fgorski@google.com
, Dec 21