Merge branch 'following-relationships-optimizations' into 'develop'
[akkoma] / benchmarks / mix / tasks / pleroma / load_testing.ex
1 defmodule Mix.Tasks.Pleroma.LoadTesting do
2 use Mix.Task
3 import Ecto.Query
4 import Pleroma.LoadTesting.Helper, only: [clean_tables: 0]
5
6 alias Pleroma.Repo
7 alias Pleroma.User
8
9 @shortdoc "Factory for generation data"
10 @moduledoc """
11 Generates data like:
12 - local/remote users
13 - local/remote activities with differrent visibility:
14 - simple activiities
15 - with emoji
16 - with mentions
17 - hellthreads
18 - with attachments
19 - with tags
20 - likes
21 - reblogs
22 - simple threads
23 - long threads
24
25 ## Generate data
26 MIX_ENV=benchmark mix pleroma.load_testing --users 20000 --friends 1000 --iterations 170 --friends_used 20 --non_friends_used 20
27 MIX_ENV=benchmark mix pleroma.load_testing -u 20000 -f 1000 -i 170 -fu 20 -nfu 20
28
29 Options:
30 - `--users NUMBER` - number of users to generate. Defaults to: 20000. Alias: `-u`
31 - `--friends NUMBER` - number of friends for main user. Defaults to: 1000. Alias: `-f`
32 - `--iterations NUMBER` - number of iterations to generate activities. For each iteration in database is inserted about 120+ activities with different visibility, actors and types.Defaults to: 170. Alias: `-i`
33 - `--friends_used NUMBER` - number of main user friends used in activity generation. Defaults to: 20. Alias: `-fu`
34 - `--non_friends_used NUMBER` - number of non friends used in activity generation. Defaults to: 20. Alias: `-nfu`
35 """
36
37 @aliases [u: :users, f: :friends, i: :iterations, fu: :friends_used, nfu: :non_friends_used]
38 @switches [
39 users: :integer,
40 friends: :integer,
41 iterations: :integer,
42 friends_used: :integer,
43 non_friends_used: :integer
44 ]
45
46 def run(args) do
47 Mix.Pleroma.start_pleroma()
48 clean_tables()
49 {opts, _} = OptionParser.parse!(args, strict: @switches, aliases: @aliases)
50
51 user = Pleroma.LoadTesting.Users.generate(opts)
52 Pleroma.LoadTesting.Activities.generate(user, opts)
53
54 IO.puts("Users in DB: #{Repo.aggregate(from(u in User), :count, :id)}")
55
56 IO.puts("Activities in DB: #{Repo.aggregate(from(a in Pleroma.Activity), :count, :id)}")
57
58 IO.puts("Objects in DB: #{Repo.aggregate(from(o in Pleroma.Object), :count, :id)}")
59
60 IO.puts(
61 "Notifications in DB: #{Repo.aggregate(from(n in Pleroma.Notification), :count, :id)}"
62 )
63
64 Pleroma.LoadTesting.Fetcher.run_benchmarks(user)
65 end
66 end