immich-app / immich

High performance self-hosted photo and video management solution.
https://immich.app
GNU Affero General Public License v3.0
44.58k stars 2.17k forks source link

[BUG] iOS app phone heat warning while indexing or backing up files #3082

Closed Kramtoske closed 11 months ago

Kramtoske commented 1 year ago

The bug

Testing on Iphone 12 pro max 2.2k photos and iphone 8 pro max 4.4k photos, when opening app for the first time "backup albums" spins (indexing) till phone shoot downs from overheat. while uploading files from phone phones also overheating till pops out warning of overheat and shutdowns phone to cool. do really need to stress cpu so much ? On andoid saw that there's timeouts for backing up. From first look likes, that cpu just melts after such intese work for a long time. Backup takes for few hours, when cpu overheats it takes more time backup because of underclocking... Phone not heat up when backing up or indexing few files. Latest iOS version all up to date. I think need to think about some optimisation on those first runs of app.

The OS that Immich Server is running on

debian 11 bullseye

Version of Immich Server

v1.65.0

Version of Immich Mobile App

1.65.0 build.105

Platform with the issue

Your docker-compose.yml content

version: "3.8"

services:
  immich-server:
    container_name: immich_server
    image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
    command: [ "start.sh", "immich" ]
    volumes:
      - ${UPLOAD_LOCATION}:/usr/src/app/upload
    env_file:
      - .env
    depends_on:
      - redis
      - database
      - typesense
    restart: always

  immich-microservices:
    container_name: immich_microservices
    image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
    command: [ "start.sh", "microservices" ]
    volumes:
      - ${UPLOAD_LOCATION}:/usr/src/app/upload
    env_file:
      - .env
    depends_on:
      - redis
      - database
      - typesense
    restart: always

  immich-machine-learning:
    container_name: immich_machine_learning
    image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
    volumes:
      - model-cache:/cache
    env_file:
      - .env
    restart: always

  immich-web:
    container_name: immich_web
    image: ghcr.io/immich-app/immich-web:${IMMICH_VERSION:-release}
    env_file:
      - .env
    restart: always

  typesense:
    container_name: immich_typesense
    image: typesense/typesense:0.24.1@sha256:9bcff2b829f12074426ca044b56160ca9d777a0c488303469143dd9f8259d4dd
    environment:
      - TYPESENSE_API_KEY=${TYPESENSE_API_KEY}
      - TYPESENSE_DATA_DIR=/data
    logging:
      driver: none
    volumes:
      - tsdata:/data
    restart: always

  redis:
    container_name: immich_redis
    image: redis:6.2-alpine@sha256:70a7a5b641117670beae0d80658430853896b5ef269ccf00d1827427e3263fa3
    restart: always

  database:
    container_name: immich_postgres
    image: postgres:14-alpine@sha256:28407a9961e76f2d285dc6991e8e48893503cc3836a4755bbc2d40bcc272a441
    env_file:
      - .env
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_USER: ${DB_USERNAME}
      POSTGRES_DB: ${DB_DATABASE_NAME}
      PG_DATA: /var/lib/postgresql/data
    volumes:
      - pgdata:/var/lib/postgresql/data
    restart: always

  immich-proxy:
    container_name: immich_proxy
    image: ghcr.io/immich-app/immich-proxy:${IMMICH_VERSION:-release}
    environment:
      # Make sure these values get passed through from the env file
      - IMMICH_SERVER_URL
      - IMMICH_WEB_URL
    ports:
      - 2283:8080
    depends_on:
      - immich-server
    restart: always

volumes:
  pgdata:
  model-cache:
  tsdata:

Your .env content

###################################################################################
# Database
###################################################################################

# NOTE: The following four database variables support Docker secrets by adding a *_FILE suffix to the variable name
# See the docker-compose documentation on secrets for additional details: https://docs.docker.com/compose/compose-file/compose-file-v3/#secrets
DB_HOSTNAME=immich_postgres
DB_USERNAME=postgres
DB_PASSWORD=anoWpJ$8JcfCZoy5qftm8M%6E
DB_DATABASE_NAME=immich

# Optional Database settings:
# DB_PORT=5432

###################################################################################
# Redis
###################################################################################

REDIS_HOSTNAME=immich_redis

# REDIS_URL will be used to pass custom options to ioredis.
# Example for Sentinel
# {"sentinels":[{"host":"redis-sentinel-node-0","port":26379},{"host":"redis-sentinel-node-1","port":26379},{"host":"redis-sentinel-node-2","port":26379}],"name":"redis-sentinel"}
# REDIS_URL=ioredis://eyJzZW50aW5lbHMiOlt7Imhvc3QiOiJyZWRpcy1zZW50aW5lbDEiLCJwb3J0IjoyNjM3OX0seyJob3N0IjoicmVkaXMtc2VudGluZWwyIiwicG9ydCI6MjYzNzl9XSwibmFtZSI6Im15bWFzdGVyIn0=

# Optional Redis settings:

# Note: these parameters are not automatically passed to the Redis Container
# to do so, please edit the docker-compose.yml file as well. Redis is not configured
# via environment variables, only redis.conf or the command line

# REDIS_PORT=6379
# REDIS_DBINDEX=0
# REDIS_USERNAME=
# REDIS_PASSWORD=
# REDIS_SOCKET=

###################################################################################
# Upload File Location
#
# This is the location where uploaded files are stored.
###################################################################################

UPLOAD_LOCATION=/photos/immich/

root@dockerhub:/opt/immich-app# cat .env 
###################################################################################
# Database
###################################################################################

# NOTE: The following four database variables support Docker secrets by adding a *_FILE suffix to the variable name
# See the docker-compose documentation on secrets for additional details: https://docs.docker.com/compose/compose-file/compose-file-v3/#secrets
DB_HOSTNAME=immich_postgres
DB_USERNAME=postgres
DB_PASSWORD=*******
DB_DATABASE_NAME=immich

# Optional Database settings:
# DB_PORT=5432

###################################################################################
# Redis
###################################################################################

REDIS_HOSTNAME=immich_redis

# REDIS_URL will be used to pass custom options to ioredis.
# Example for Sentinel
# {"sentinels":[{"host":"redis-sentinel-node-0","port":26379},{"host":"redis-sentinel-node-1","port":26379},{"host":"redis-sentinel-node-2","port":26379}],"name":"redis-sentinel"}
# REDIS_URL=ioredis://eyJzZW50aW5lbHMiOlt7Imhvc3QiOiJyZWRpcy1zZW50aW5lbDEiLCJwb3J0IjoyNjM3OX0seyJob3N0IjoicmVkaXMtc2VudGluZWwyIiwicG9ydCI6MjYzNzl9XSwibmFtZSI6Im15bWFzdGVyIn0=

# Optional Redis settings:

# Note: these parameters are not automatically passed to the Redis Container
# to do so, please edit the docker-compose.yml file as well. Redis is not configured
# via environment variables, only redis.conf or the command line

# REDIS_PORT=6379
# REDIS_DBINDEX=0
# REDIS_USERNAME=
# REDIS_PASSWORD=
# REDIS_SOCKET=

###################################################################################
# Upload File Location
#
# This is the location where uploaded files are stored.
###################################################################################

UPLOAD_LOCATION=/photos/immich/

###################################################################################
# Typesense
###################################################################################
TYPESENSE_API_KEY=momutSHhEEudVDMqtLxypcFdL
# TYPESENSE_ENABLED=false
# TYPESENSE_URL uses base64 encoding for the nodes json.
# Example JSON that was used:
# [
#      { "host": "typesense-1.example.net", "port": "443", "protocol": "https" },
#      { "host": "typesense-2.example.net", "port": "443", "protocol": "https" },
#      { "host": "typesense-3.example.net", "port": "443", "protocol": "https" },
# ]
# TYPESENSE_URL=ha://WwogIHsgImhvc3QiOiAidHlwZXNlbnNlLTEuZXhhbXBsZS5uZXQiLCAicG9ydCI6ICI0NDMiLCAicHJvdG9jb2wiOiAiaHR0cHMiIH0sCiAgeyAiaG9zdCI6ICJ0eXBlc2Vuc2UtMi5leGFtcGxlLm5ldCIsICJwb3J0IjogIjQ0MyIsICJwcm90b2NvbCI6ICJodHRwcyIgfSwKICB7ICJob3N0IjogInR5cGVzZW5zZS0zLmV4YW1wbGUubmV0IiwgInBvcnQiOiAiNDQzIiwgInByb3RvY29sIjogImh0dHBzIiB9Cl0=

###################################################################################
# Reverse Geocoding
#
# Reverse geocoding is done locally which has a small impact on memory usage
# This memory usage can be altered by changing the REVERSE_GEOCODING_PRECISION variable
# This ranges from 0-3 with 3 being the most precise
# 3 - Cities > 500 population: ~200MB RAM
# 2 - Cities > 1000 population: ~150MB RAM
# 1 - Cities > 5000 population: ~80MB RAM
# 0 - Cities > 15000 population: ~40MB RAM
####################################################################################

# DISABLE_REVERSE_GEOCODING=false
# REVERSE_GEOCODING_PRECISION=3

####################################################################################
# WEB - Optional
#
# Custom message on the login page, should be written in HTML form.
# For example:
# PUBLIC_LOGIN_PAGE_MESSAGE="This is a demo instance of Immich.<br><br>Email: <i>demo@demo.de</i><br>Password: <i>demo</i>"
####################################################################################

PUBLIC_LOGIN_PAGE_MESSAGE=

####################################################################################
# Alternative Service Addresses - Optional
#
# This is an advanced feature for users who may be running their immich services on different hosts.
# It will not change which address or port that services bind to within their containers, but it will change where other services look for their peers.
# Note: immich-microservices is bound to 3002, but no references are made
####################################################################################

IMMICH_WEB_URL=http://immich-web:3000
IMMICH_SERVER_URL=http://immich-server:3001
IMMICH_MACHINE_LEARNING_URL=http://immich-machine-learning:3003

####################################################################################
# Alternative API's External Address - Optional
#
# This is an advanced feature used to control the public server endpoint returned to clients during Well-known discovery.
# You should only use this if you want mobile apps to access the immich API over a custom URL. Do not include trailing slash.
# NOTE: At this time, the web app will not be affected by this setting and will continue to use the relative path: /api
# Examples: http://localhost:3001, http://immich-api.example.com, etc
####################################################################################

#IMMICH_API_URL_EXTERNAL=http://localhost:3001

###################################################################################
# Immich Version - Optional
#
# This allows all immich docker images to be pinned to a specific version. By default,
# the version is "release" but could be a specific version, like "v1.59.0".
###################################################################################

#IMMICH_VERSION=

Reproduction steps

1.took phone with 2k photos
2. install first time immich app
3. select backup albums (should spin for a while at first time and phone heat up or even shoot down
4. if gets lucky run after indexing should start backing up and heat up more and process slowing up, phone so hot on processor side that is hard to hold

Additional information

would be nice to have extra reverse proxy sample as documentation what to set on reverse proxy, because when connecting directly backups are smooth, but when on reverse proxy sometimes it stuck randomly on some video or img and cannot backup, only via local address, not external (reverse proxy -> immic proxy)

uhthomas commented 1 year ago

I see similar behaviour with Google Photos to be honest. I found that iPhones tend to overheat, even when the CPU isn't doing much. I've had to keep my iPhone on a literal block of ice whilst using it as a hot spot. I'll leave this open for another collaborator to review, but I don't think there's much we can do here?

ddshd commented 1 year ago

I see similar behaviour with Google Photos to be honest. ...

Are either of you using cases? Try removing the case and see if there is a difference

uhthomas commented 1 year ago

I see similar behaviour with Google Photos to be honest. ...

Are either of you using cases? Try removing the case and see if there is a difference

I don't use a case. I think these phones just have poor thermal performance.

Kramtoske commented 1 year ago

I see similar behaviour with Google Photos to be honest. ...

Are either of you using cases? Try removing the case and see if there is a difference

I’m also didn’t used case on both phones, now holding one of phones in fridge in 5h done 1700/4400 photo and video sync over 1gbps lan. On other tasks phone not boils so much even when recording 4k hdr what is stressful for cpu and storage.

in fridge over half hour managed to upload additional 2k assets

alextran1502 commented 1 year ago

I have iPhone 12 Pro as well and it is quite strange I don't get this issue. However, I can take a look at profiling CPU usage again in the near future in Xcode.

alextran1502 commented 1 year ago

FYI if your phone is connected to WIFI on 5Ghz band, it will upload much faster

ddshd commented 1 year ago

I’m also didn’t used case on both phones, now holding one of phones in fridge in 5h done 1700/4400 photo and video sync over 1gbps lan. On other tasks phone not boils so much even when recording 4k hdr what is stressful for cpu and storage.

I don't use a case. I think these phones just have poor thermal performance.

Then it's just iOS's terrible heat management. My phone gets super-hot while using Photosync too but it would only show the heat warning when I had my case on..

now holding one of phones in fridge

Be careful with that, you're introducing the chance of condensation inside your phone. Might be better/as affective to point a fan at it, or put it near an AC.

Pro100x3mal commented 1 year ago

I have iPhone 12 Pro as well and it is quite strange I don't get this issue. However, I can take a look at profiling CPU usage again in the near future in Xcode.

i also have iphone 12 pro max, ios 16.5.1. It took about 3 days to upload 11k media files, as all applications were constantly interrupted due to iPhone overheating. I also noticed that sometimes the upload is simply interrupted, although there are no errors. In this case, I close the application, then open it and click again to make a backup

alextran1502 commented 11 months ago

This is due to the I/O operation, there is nothing we could do besides limits the upload per hour