Skip to content

Commit

Permalink
Remove type inference profiling, since thread safety was never merged…
Browse files Browse the repository at this point in the history
… upstream:

JuliaLang/julia#47615 was never merged, so this
feature cannot be used yet anyway. :(

And the compat bounds are currently too strict, and are causing issues
in RelationalAI's build
  • Loading branch information
NHDaly committed Aug 14, 2023
1 parent e38ab79 commit 88001ec
Show file tree
Hide file tree
Showing 2 changed files with 0 additions and 69 deletions.
45 changes: 0 additions & 45 deletions src/ProfileEndpoints.jl
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,6 @@ import HTTP
import Profile
import PProf

using FlameGraphs
using SnoopCompile
import SnoopCompileCore

using Serialization: serialize

#----------------------------------------------------------
Expand Down Expand Up @@ -247,42 +243,6 @@ end

end # if isdefined

###
### Type Inference
###

function typeinf_start_endpoint(req::HTTP.Request)
if !isdefined(Core.Compiler.Timings, :clear_and_fetch_timings)
# See: https://github.com/JuliaLang/julia/pull/47615.
return HTTP.Response(501, "Type inference profiling isn't thread safe without Julia #47615.")
end
SnoopCompileCore.start_deep_timing()
return HTTP.Response(200, "Type inference profiling started.")
end

function typeinf_stop_endpoint(req::HTTP.Request)
if !isdefined(Core.Compiler.Timings, :clear_and_fetch_timings)
# See: https://github.com/JuliaLang/julia/pull/47615.
return HTTP.Response(501, "Type inference profiling isn't thread safe without Julia #47615.")
end

SnoopCompileCore.stop_deep_timing()
timings = SnoopCompileCore.finish_snoopi_deep()

# Currently, SnoopCompile will throw an error if timings is empty..
# Reported, here: https://github.com/timholy/SnoopCompile.jl/pull/212/files#r1062926193
if isempty(timings.children)
# So just return an empty profile..
return _http_response("", "inference_profile.pb.gz")
end

flame_graph = flamegraph(timings)
prof_name = tempname()
PProf.pprof(flame_graph; out=prof_name, web=false)
prof_name = "$prof_name.pb.gz"
return _http_response(read(prof_name), "inference_profile.pb.gz")
end

###
### Server
###
Expand All @@ -297,8 +257,6 @@ function serve_profiling_server(;addr="127.0.0.1", port=16825, verbose=false, kw
HTTP.register!(router, "/allocs_profile", allocations_profile_endpoint)
HTTP.register!(router, "/allocs_profile_start", allocations_start_endpoint)
HTTP.register!(router, "/allocs_profile_stop", allocations_stop_endpoint)
HTTP.register!(router, "/typeinf_profile_start", typeinf_start_endpoint)
HTTP.register!(router, "/typeinf_profile_stop", typeinf_stop_endpoint)
# HTTP.serve! returns listening/serving server object
return HTTP.serve!(router, addr, port; verbose, kw...)
end
Expand All @@ -324,9 +282,6 @@ function __init__()
precompile(_start_alloc_profile, (Float64,)) || error("precompilation of package functions is not supposed to fail")
precompile(_stop_alloc_profile, ()) || error("precompilation of package functions is not supposed to fail")
end

precompile(typeinf_start_endpoint, (HTTP.Request,)) || error("precompilation of package functions is not supposed to fail")
precompile(typeinf_stop_endpoint, (HTTP.Request,)) || error("precompilation of package functions is not supposed to fail")
end

end # module ProfileEndpoints
24 changes: 0 additions & 24 deletions test/runtests.jl
Original file line number Diff line number Diff line change
Expand Up @@ -154,30 +154,6 @@ const url = "http://127.0.0.1:$port"
end
end

@testset "Type inference profiling" begin
if !isdefined(Core.Compiler.Timings, :clear_and_fetch_timings)
@test HTTP.get("$url/typeinf_profile_start", retry=false, status_exception=false).status == 501
@test HTTP.get("$url/typeinf_profile_stop", retry=false, status_exception=false).status == 501
else
@testset "typeinf start/stop endpoints" begin
resp = HTTP.get("$url/typeinf_profile_start", retry=false, status_exception=false)
@test resp.status == 200
@test String(resp.body) == "Type inference profiling started."

# workload
@eval foo() = 2
@eval foo()

resp = HTTP.get("$url/typeinf_profile_stop", retry=false, status_exception=false)
@test resp.status == 200
data = read(IOBuffer(resp.body), String)
# Test that there's something here
# TODO: actually parse the profile
@test length(data) > 100
end
end
end

@testset "error handling" begin
let res = HTTP.get("$url/profile", status_exception=false)
@test 400 <= res.status < 500
Expand Down

0 comments on commit 88001ec

Please sign in to comment.