mirror of
https://github.com/superseriousbusiness/gotosocial.git
synced 2024-10-31 22:40:01 +00:00
[chore] Add media-ffmpeg-pool-size
config var (#3164)
This commit is contained in:
parent
09f239d7e3
commit
fa59c3713c
7 changed files with 77 additions and 4 deletions
|
@ -487,16 +487,24 @@ func setLimits(ctx context.Context) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func precompileWASM(ctx context.Context) error {
|
func precompileWASM(ctx context.Context) error {
|
||||||
// TODO: make max number instances configurable
|
|
||||||
maxprocs := runtime.GOMAXPROCS(0)
|
|
||||||
if err := sqlite3.Initialize(); err != nil {
|
if err := sqlite3.Initialize(); err != nil {
|
||||||
return gtserror.Newf("error compiling sqlite3: %w", err)
|
return gtserror.Newf("error compiling sqlite3: %w", err)
|
||||||
}
|
}
|
||||||
if err := ffmpeg.InitFfmpeg(ctx, maxprocs); err != nil {
|
|
||||||
|
// Use admin-set ffmpeg pool size, and fall
|
||||||
|
// back to GOMAXPROCS if number 0 or less.
|
||||||
|
ffPoolSize := config.GetMediaFfmpegPoolSize()
|
||||||
|
if ffPoolSize <= 0 {
|
||||||
|
ffPoolSize = runtime.GOMAXPROCS(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := ffmpeg.InitFfmpeg(ctx, ffPoolSize); err != nil {
|
||||||
return gtserror.Newf("error compiling ffmpeg: %w", err)
|
return gtserror.Newf("error compiling ffmpeg: %w", err)
|
||||||
}
|
}
|
||||||
if err := ffmpeg.InitFfprobe(ctx, maxprocs); err != nil {
|
|
||||||
|
if err := ffmpeg.InitFfprobe(ctx, ffPoolSize); err != nil {
|
||||||
return gtserror.Newf("error compiling ffprobe: %w", err)
|
return gtserror.Newf("error compiling ffprobe: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,6 +56,24 @@ media-emoji-local-max-size: 50KiB
|
||||||
# Default: 100KiB (102400 bytes)
|
# Default: 100KiB (102400 bytes)
|
||||||
media-emoji-remote-max-size: 100KiB
|
media-emoji-remote-max-size: 100KiB
|
||||||
|
|
||||||
|
# Int. Number of instances of ffmpeg+ffprobe to add to the media processing pool.
|
||||||
|
#
|
||||||
|
# Increasing this number will lead to faster concurrent media processing,
|
||||||
|
# but at the cost of up to about 250MB of (spiking) memory usage per increment.
|
||||||
|
#
|
||||||
|
# You'll want to increase this number if you have RAM to spare, and/or if you're
|
||||||
|
# hosting an instance for more than 50 or so people who post/view lots of media,
|
||||||
|
# but you should leave it at 1 for single-user instances or when running GoToSocial
|
||||||
|
# in a constrained (low-memory) environment.
|
||||||
|
#
|
||||||
|
# If you set this number to 0 or less, then instead of a fixed number of instances,
|
||||||
|
# it will scale with GOMAXPROCS x 1, yielding (usually) one ffmpeg instance and one
|
||||||
|
# ffprobe instance per CPU core on the host machine.
|
||||||
|
#
|
||||||
|
# Examples: [1, 2, -1, 8]
|
||||||
|
# Default: 1
|
||||||
|
media-ffmpeg-pool-size: 1
|
||||||
|
|
||||||
# The below media cleanup settings allow admins to customize when and
|
# The below media cleanup settings allow admins to customize when and
|
||||||
# how often media cleanup + prune jobs run, while being set to a fairly
|
# how often media cleanup + prune jobs run, while being set to a fairly
|
||||||
# sensible default (every night @ midnight). For more information on exactly
|
# sensible default (every night @ midnight). For more information on exactly
|
||||||
|
|
|
@ -493,6 +493,24 @@ media-emoji-local-max-size: 50KiB
|
||||||
# Default: 100KiB (102400 bytes)
|
# Default: 100KiB (102400 bytes)
|
||||||
media-emoji-remote-max-size: 100KiB
|
media-emoji-remote-max-size: 100KiB
|
||||||
|
|
||||||
|
# Int. Number of instances of ffmpeg+ffprobe to add to the media processing pool.
|
||||||
|
#
|
||||||
|
# Increasing this number will lead to faster concurrent media processing,
|
||||||
|
# but at the cost of up to about 250MB of (spiking) memory usage per increment.
|
||||||
|
#
|
||||||
|
# You'll want to increase this number if you have RAM to spare, and/or if you're
|
||||||
|
# hosting an instance for more than 50 or so people who post/view lots of media,
|
||||||
|
# but you should leave it at 1 for single-user instances or when running GoToSocial
|
||||||
|
# in a constrained (low-memory) environment.
|
||||||
|
#
|
||||||
|
# If you set this number to 0 or less, then instead of a fixed number of instances,
|
||||||
|
# it will scale with GOMAXPROCS x 1, yielding (usually) one ffmpeg instance and one
|
||||||
|
# ffprobe instance per CPU core on the host machine.
|
||||||
|
#
|
||||||
|
# Examples: [1, 2, -1, 8]
|
||||||
|
# Default: 1
|
||||||
|
media-ffmpeg-pool-size: 1
|
||||||
|
|
||||||
# The below media cleanup settings allow admins to customize when and
|
# The below media cleanup settings allow admins to customize when and
|
||||||
# how often media cleanup + prune jobs run, while being set to a fairly
|
# how often media cleanup + prune jobs run, while being set to a fairly
|
||||||
# sensible default (every night @ midnight). For more information on exactly
|
# sensible default (every night @ midnight). For more information on exactly
|
||||||
|
|
|
@ -101,6 +101,7 @@ type Configuration struct {
|
||||||
MediaRemoteMaxSize bytesize.Size `name:"media-remote-max-size" usage:"Max size in bytes of media to download from other instances"`
|
MediaRemoteMaxSize bytesize.Size `name:"media-remote-max-size" usage:"Max size in bytes of media to download from other instances"`
|
||||||
MediaCleanupFrom string `name:"media-cleanup-from" usage:"Time of day from which to start running media cleanup/prune jobs. Should be in the format 'hh:mm:ss', eg., '15:04:05'."`
|
MediaCleanupFrom string `name:"media-cleanup-from" usage:"Time of day from which to start running media cleanup/prune jobs. Should be in the format 'hh:mm:ss', eg., '15:04:05'."`
|
||||||
MediaCleanupEvery time.Duration `name:"media-cleanup-every" usage:"Period to elapse between cleanups, starting from media-cleanup-at."`
|
MediaCleanupEvery time.Duration `name:"media-cleanup-every" usage:"Period to elapse between cleanups, starting from media-cleanup-at."`
|
||||||
|
MediaFfmpegPoolSize int `name:"media-ffmpeg-pool-size" usage:"Number of instances of the embedded ffmpeg WASM binary to add to the media processing pool. 0 or less uses GOMAXPROCS."`
|
||||||
|
|
||||||
StorageBackend string `name:"storage-backend" usage:"Storage backend to use for media attachments"`
|
StorageBackend string `name:"storage-backend" usage:"Storage backend to use for media attachments"`
|
||||||
StorageLocalBasePath string `name:"storage-local-base-path" usage:"Full path to an already-created directory where gts should store/retrieve media files. Subfolders will be created within this dir."`
|
StorageLocalBasePath string `name:"storage-local-base-path" usage:"Full path to an already-created directory where gts should store/retrieve media files. Subfolders will be created within this dir."`
|
||||||
|
|
|
@ -80,6 +80,7 @@
|
||||||
MediaEmojiRemoteMaxSize: 100 * bytesize.KiB,
|
MediaEmojiRemoteMaxSize: 100 * bytesize.KiB,
|
||||||
MediaCleanupFrom: "00:00", // Midnight.
|
MediaCleanupFrom: "00:00", // Midnight.
|
||||||
MediaCleanupEvery: 24 * time.Hour, // 1/day.
|
MediaCleanupEvery: 24 * time.Hour, // 1/day.
|
||||||
|
MediaFfmpegPoolSize: 1,
|
||||||
|
|
||||||
StorageBackend: "local",
|
StorageBackend: "local",
|
||||||
StorageLocalBasePath: "/gotosocial/storage",
|
StorageLocalBasePath: "/gotosocial/storage",
|
||||||
|
|
|
@ -1300,6 +1300,31 @@ func GetMediaCleanupEvery() time.Duration { return global.GetMediaCleanupEvery()
|
||||||
// SetMediaCleanupEvery safely sets the value for global configuration 'MediaCleanupEvery' field
|
// SetMediaCleanupEvery safely sets the value for global configuration 'MediaCleanupEvery' field
|
||||||
func SetMediaCleanupEvery(v time.Duration) { global.SetMediaCleanupEvery(v) }
|
func SetMediaCleanupEvery(v time.Duration) { global.SetMediaCleanupEvery(v) }
|
||||||
|
|
||||||
|
// GetMediaFfmpegPoolSize safely fetches the Configuration value for state's 'MediaFfmpegPoolSize' field
|
||||||
|
func (st *ConfigState) GetMediaFfmpegPoolSize() (v int) {
|
||||||
|
st.mutex.RLock()
|
||||||
|
v = st.config.MediaFfmpegPoolSize
|
||||||
|
st.mutex.RUnlock()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetMediaFfmpegPoolSize safely sets the Configuration value for state's 'MediaFfmpegPoolSize' field
|
||||||
|
func (st *ConfigState) SetMediaFfmpegPoolSize(v int) {
|
||||||
|
st.mutex.Lock()
|
||||||
|
defer st.mutex.Unlock()
|
||||||
|
st.config.MediaFfmpegPoolSize = v
|
||||||
|
st.reloadToViper()
|
||||||
|
}
|
||||||
|
|
||||||
|
// MediaFfmpegPoolSizeFlag returns the flag name for the 'MediaFfmpegPoolSize' field
|
||||||
|
func MediaFfmpegPoolSizeFlag() string { return "media-ffmpeg-pool-size" }
|
||||||
|
|
||||||
|
// GetMediaFfmpegPoolSize safely fetches the value for global configuration 'MediaFfmpegPoolSize' field
|
||||||
|
func GetMediaFfmpegPoolSize() int { return global.GetMediaFfmpegPoolSize() }
|
||||||
|
|
||||||
|
// SetMediaFfmpegPoolSize safely sets the value for global configuration 'MediaFfmpegPoolSize' field
|
||||||
|
func SetMediaFfmpegPoolSize(v int) { global.SetMediaFfmpegPoolSize(v) }
|
||||||
|
|
||||||
// GetStorageBackend safely fetches the Configuration value for state's 'StorageBackend' field
|
// GetStorageBackend safely fetches the Configuration value for state's 'StorageBackend' field
|
||||||
func (st *ConfigState) GetStorageBackend() (v string) {
|
func (st *ConfigState) GetStorageBackend() (v string) {
|
||||||
st.mutex.RLock()
|
st.mutex.RLock()
|
||||||
|
|
|
@ -126,6 +126,7 @@ EXPECT=$(cat << "EOF"
|
||||||
"media-description-min-chars": 69,
|
"media-description-min-chars": 69,
|
||||||
"media-emoji-local-max-size": 420,
|
"media-emoji-local-max-size": 420,
|
||||||
"media-emoji-remote-max-size": 420,
|
"media-emoji-remote-max-size": 420,
|
||||||
|
"media-ffmpeg-pool-size": 8,
|
||||||
"media-local-max-size": 420,
|
"media-local-max-size": 420,
|
||||||
"media-remote-cache-days": 30,
|
"media-remote-cache-days": 30,
|
||||||
"media-remote-max-size": 420,
|
"media-remote-max-size": 420,
|
||||||
|
@ -245,6 +246,7 @@ GTS_MEDIA_REMOTE_MAX_SIZE=420 \
|
||||||
GTS_MEDIA_REMOTE_CACHE_DAYS=30 \
|
GTS_MEDIA_REMOTE_CACHE_DAYS=30 \
|
||||||
GTS_MEDIA_EMOJI_LOCAL_MAX_SIZE=420 \
|
GTS_MEDIA_EMOJI_LOCAL_MAX_SIZE=420 \
|
||||||
GTS_MEDIA_EMOJI_REMOTE_MAX_SIZE=420 \
|
GTS_MEDIA_EMOJI_REMOTE_MAX_SIZE=420 \
|
||||||
|
GTS_MEDIA_FFMPEG_POOL_SIZE=8 \
|
||||||
GTS_METRICS_AUTH_ENABLED=false \
|
GTS_METRICS_AUTH_ENABLED=false \
|
||||||
GTS_METRICS_ENABLED=false \
|
GTS_METRICS_ENABLED=false \
|
||||||
GTS_STORAGE_BACKEND='local' \
|
GTS_STORAGE_BACKEND='local' \
|
||||||
|
|
Loading…
Reference in a new issue